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