题目地址:http://codevs.cn/problem/1004/
分析:
搜索
代码:
const
xp:array[1..4]of integer=(1,0,0,-1);
yp:array[1..4]of integer=(0,1,-1,0);
var
a:array[0..5,0..5] of integer;
s:string;
m,n,i,j,min:integer;
procedure dfs(x,y,num,bu:integer);
var
i,j,k,m:integer;
begin
if num>=min then exit;
m:=10000;
for i:=1 to 4 do
begin
if (a[i,1]=a[i,2])and(a[i,2]=a[i,3])and(a[i,3]=a[i,4])and((a[i,4]=1)or(a[i,4]=2)) then m:=num;
if (a[1,i]=a[2,i])and(a[2,i]=a[3,i])and(a[3,i]=a[4,i])and((a[4,i]=1)or(a[4,i]=2)) then m:=num;
end;
if (a[1,1]=a[2,2])and(a[2,2]=a[3,3])and(a[3,3]=a[4,4])and((a[4,4]=1)or(a[4,4]=2)) then m:=num;
if (a[1,4]=a[2,3])and(a[2,3]=a[3,2])and(a[3,2]=a[4,1])and((a[4,1]=1)or(a[4,1]=2)) then m:=num; //判断是否四子连棋
if m<min then
begin
min:=m;
exit;
end;
for i:=4 downto 1 do
begin
if(x+xp[i]<5)and(x+xp[i]>0)and(y+yp[i]>0)and
(y+yp[i]<5)and(bu=a[x+xp[i],y+yp[i]]) then
begin
a[x,y]:=a[x+xp[i],y+yp[i]];
a[x+xp[i],y+yp[i]]:=0;
if bu=1 then bu:=2
else bu:=1;
for j:=1 to 4 do
for k:=1 to 4 do
if a[j,k]=0 then
dfs(j,k,num+1,bu); //找到空的位置再深搜
if bu=1 then bu:=2
else bu:=1;
a[x+xp[i],y+yp[i]]:=a[x,y];
a[x,y]:=0; //回溯
end;
end;
end;
begin
min:=10;
for i:=1 to 4 do
begin
readln(s);
for j:=1 to 4 do
case s[j] of
'B':a[i,j]:=1;
'W':a[i,j]:=2;
'O':a[i,j]:=0; //读入存储
end;
end;
for i:=1 to 4 do
for j:=1 to 4 do
if a[i,j]=0 then
begin
dfs(i,j,0,1);
dfs(i,j,0,2);
end;
writeln(min);
end.