Codevs 1004 四子連棋

2022-02-27 11:43:25 字數 2575 閱讀 3050

時間限制: 1 s

空間限制: 128000 kb

題目等級 : ** gold

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

●○●○

●●○●

○○●○

輸入描述 input description

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

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

樣例輸入 sample input

bwbo

wbwb

bwbw

wbwo

樣例輸出 sample output

分析 analysis

搜尋經典題

這道題只是看上去很難= =

首先我們要明確我們要做的事情:

輸入 判斷勝局 行棋 狀態儲存 狀態判重

其中行棋我們有:尋找行棋位 判斷是否行棋 行棋

對於狀態,我們有:棋盤 序列碼(hash碼) 步數 行棋方

然後打一遍就過了= =

** code

1 #include2 #include3 #include4 #include5

#define ll long long

6using

namespace

std;78

const

int dir[4][2] = ,,,};

9int hash[100000000

];10

//state: map step last hashcode?

11//

input:

12//

play:

13//

findspace -> move -> hash? -> check? -> push

14//

-> print

15//

check:

16//

x? -> y? -> lu/ru?

1718

struct

map26

};27

28 queueq;

2930

bool

check(map now)

3637

if(now.map[1][1] == now.map[2][2] && now.map[2][2] == now.map[3][3] && now.map[3][3] == now.map[4][4] ||

38 now.map[1][4] == now.map[2][3] && now.map[2][3] == now.map[3][2] && now.map[3][2] == now.map[4][1

])41

42return

false;43

}4445bool

getcode(map now)53}

54 code += now.last*cnt;

55 code %= 42137897;56

57if(hash[code]) return

false;58

else62}

6364

void

input()74}

75}7677 sta.step = 0;78

79 sta.last = 1;80

if(getcode(sta)) q.push(sta);

81 sta.last = 2;82

if(getcode(sta)) q.push(sta);83}

8485

void move(map now,int x,int

y)101

}102

103void findspace(map now,int &x1,int &y1,int &x2,int &y2)else

112}

113}

114}

115}

116117

void

bfs()

127128

int x1 = -1,x2 = -1,y1 = -1,y2 = -1

;129

130findspace(tmp,x1,y1,x2,y2);

131132

move(tmp,x1,y1);

133134

move(tmp,x2,y2);

135}

136}

137138

intmain()

= =心情很差

codevs 1004 四子連棋

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

codevs 1004 四子連棋

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

codevs 1004 四子連棋

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