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