時間限制: 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
很像八數碼問題,狀態空間搜尋
儲存state乙個二維陣列,本次選的顏色,步數,(封裝乙個結構體也可以),bfs就行了,每次從空白走
hash表來判重
手寫佇列乙個好處是可以直接用佇列的編號
ps:1從hzwer那裡學了些命名
2據說迭代加深也可以,感覺並不好寫
////codevs1004
////
created by candy on 9/29/16.
////
#include
#include
#include
#include
using
namespace
std;
const
int n=5,maxn=1e6,mod=155333,hashsize=2e5;
typedef
intstate[n][n];
inline
intread()
while(c>='
0'&&c<='9')
returnx;}
int dx[4]=,dy[4]=,ans=-1
;char
s[n];
state q[maxn];
int head=1,tail=0
,d[maxn],col[maxn];
bool equ(char a,char b,char c,char
d)bool check(state &a)
if(equ(a[1][1],a[2][2],a[3][3],a[4][4]))return1;
if(equ(a[1][4],a[2][3],a[3][2],a[4][1]))return1;
return0;
}bool valid(int x,int y,int
num)
inth[hashsize],ne[hashsize];
void init()
int gethash(state &s)
returnx;}
bool tti(int
num)
void move(int x,int
y)
else tail--;
if(check(t)) ans=d[tail];
}}void
bfs()
}int main(int argc, const
char *argv)
}col[
1]=1;col[2]=2
; bfs();
printf("%d
",ans);
return0;
}
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顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形...