wikioi1004 四子連棋

2021-07-26 10:06:25 字數 2032 閱讀 8973

題目描述 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顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形...