codevs1004 四子連棋 狀壓bfs

2022-05-20 14:26:54 字數 985 閱讀 2456

題目大意:給定乙個大小為 4*4 的棋盤,分別有 7 個黑子、7 個白子和 2 個空位構成,求出至少需要移動多少步,才能使得四個相同的棋子共線。

題解:顯然每一種棋盤的局面都是乙個狀態,因此需要採用狀態壓縮的搜尋。總共的局面最多有4e7種,並且所給的記憶體足夠開下雜湊表。

需要注意的是,資料中有很多不是對稱的情況,因此需要分別考慮先移動白子和黑子的情況,再取最小值,得到答案。

**如下

#include using namespace std;

const int maxn=5e7;

const int inf=0x3f3f3f3f;

const int dx=;

const int dy=;

//b->1 w->0 o->2

char s[10];

int state[5][5],mp[2][maxn],ans=inf,st;

bool col[maxn]; //b->1 w->0

int get_hash(int a[5][5])

void get_state(int val)

void read_and_parse()

} st=get_hash(state);

}bool right(int x,int y,int cor)

bool check(int a[5][5])

if(a[1][1]==a[2][2]&&a[2][2]==a[3][3]&&a[3][3]==a[4][4])return 1;

if(a[1][4]==a[2][3]&&a[2][3]==a[3][2]&&a[3][2]==a[4][1])return 1;

return 0;

}void solve(int cor)

for(int i=1;i<=4;i++)for(int j=1;j<=4;j++)if(state[i][j]==2)

} }}int main()

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