題目描述 description
在乙個4*4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形成四個一線(包括斜線),這樣的狀態為目標棋局。●○
●○●○
●●○●
○○●○
輸入描述 input description
從檔案中讀入乙個4*4的初始棋局,黑棋子用b表示,白棋子用w表示,空格地帶用o表示。
輸出描述 output description
用最少的步數移動到目標棋局的步數。
樣例輸入 sample input
bwbo
wbwb
bwbw
wbwo
樣例輸出 sample output 5
題解:還是爆搜,本題應該用廣搜比較好,我寫的程式是深搜
const
dx:array[1..4,1..2]of shortint=((1,0),(0,1),(0,-1),(-1,0));
var a:array[1..4,1..4]of char;
i,j:shortint;
ans,n:longint;
function check:boolean;
var i:shortint;
begin
for i:=1 to 4 do
begin
if(a[i,1]=a[i,2])and(a[i,1]=a[i,3])and(a[i,1]=a[i,4])then exit(true);
if(a[1,i]=a[2,i])and(a[1,i]=a[3,i])and(a[1,i]=a[4,i])then exit(true);
end;
if(a[1,1]=a[2,2])and(a[1,1]=a[3,3])and(a[1,1]=a[4,4])then exit(true);
if(a[4,1]=a[3,2])and(a[4,1]=a[2,3])and(a[4,1]=a[1,4])then exit(true);
exit(false);
end;
procedure dfs(step,dir,x1,y1:integer;last:char);
var i,j,k,x,y:shortint;
begin
if step>=ans then exit;
if check then ans:=step
else
begin
if step<>0 then
begin
a[x1,y1]:=last;
a[x1+dx[dir,1],y1+dx[dir,2]]:='o';
end;
for i:=1 to 4 do
for j:=1 to 4 do
if a[i,j]='o'then
for k:=1 to 4 do
begin
x:=i+dx[k,1];
y:=j+dx[k,2];
if(x<5)and(x>0)and(y<5)and(y>0)and(a[x,y]<>last) then
dfs(step+1,k,i,j,a[x,y]);
end;
if step<>0 then
begin
a[x1,y1]:='o';
a[x1+dx[dir,1],y1+dx[dir,2]]:=last;
end;
end;
end;
begin
for i:=1 to 4 do
begin
for j:=1 to 4 do
read(a[i,j]);
readln;
end;
ans:=100;
dfs(0,0,0,0,'0');
writeln(ans-1);
end.
codevs 1004 四子連棋
1004 四子連棋 時間限制 1 s 空間限制 128000 kb 題目等級 gold題解 題目描述description 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋...
codevs 1004 四子連棋
題目描述 description 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形成四個一線 包括斜線 這樣的狀態為...
Codevs 1004 四子連棋
時間限制 1 s 空間限制 128000 kb 題目等級 gold 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形...