codevs1004四子連棋 BFS 雜湊

2021-09-07 07:01:49 字數 1934 閱讀 8896

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