codevs 1004 四子連棋

2021-07-30 12:58:22 字數 2268 閱讀 9012

1004 四子連棋

時間限制: 1 s

空間限制: 128000 kb

題目等級 : ** gold題解

題目描述description

在乙個4*4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形成四個一線(包括斜線),這樣的狀態為目標棋局。

輸入描述input description

從檔案中讀入乙個4*4的初始棋局,黑棋子用b表示,白棋子用w表示,空格地帶用o表示。

輸出描述output description

用最少的步數移動到目標棋局的步數。

樣例輸入sample input

bwbo

wbwb

bwbw

wbwo

樣例輸出sample output

這個題範圍特別小,但很麻煩。

需要考慮的東西:下次該哪個棋子走,移動哪個空白格,如何判斷狀態是否符合要求,如何判重

這些問題需要一步步解決,首先我用結構體儲存整個棋盤,包括棋盤裡的棋子排布,下一次不該哪種棋子走(也可以認為這種局面是由哪種棋子走來而造成的)

搜尋的進行兩次,一次是第一步黑子先出,另一次是第一步白子先出。

接下來一些普通的bfs步驟

判重用的是hash,把整個棋盤轉化為由0,1,2構成的字串,借助map完成判重

#include#include

#include

#include

using

namespace

std;

int head,tail=1,step[10000

];int e_[4][2]=,,,},now[10][10

],ans;

struct

node;node e[

10000

];map

hash;

bool

pd(node z)

}if(hash[s]==1)return

true

;

else

}bool judge(int x,int

y)void

copy()

bool equ(int a1,int a2,int a3,int a4)

bool check(int

w)

if(equ(e[w].map[1][1],e[w].map[2][2],e[w].map[3][3],e[w].map[4][4]))return1;

if(equ(e[w].map[1][4],e[w].map[2][3],e[w].map[3][2],e[w].map[4][1]))return1;

return0;

}void

bfs()

else

step[tail]=step[head]+1

;

if(check(tail))

if(pd(e[tail]))tail--;}}

}}}}

}char ch[10

];int

main()

}for(int i=1;i<=4;i++)

for(int j=1;j<=4;j++)

e[1].map[i][j]=now[i][j];

e[1].f=1

; bfs();

head=0;tail=1

; memset(e,

0,sizeof

(e));

memset(step,

0,sizeof

(step));

hash.clear();

for(int i=1;i<=4;i++)

for(int j=1;j<=4;j++)

e[1].map[i][j]=now[i][j];

e[1].f=-1

; bfs();

cout

<}

codevs 1004 四子連棋

題目描述 description 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形成四個一線 包括斜線 這樣的狀態為...

Codevs 1004 四子連棋

時間限制 1 s 空間限制 128000 kb 題目等級 gold 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形...

codevs 1004 四子連棋

1004 四子連棋 時間限制 1 s 空間限制 128000 kb 題目等級 gold 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得...