luogu2346 四子連棋

2022-06-30 07:33:09 字數 1523 閱讀 1513

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

總體思路很簡單,bfs即可,只是需要注意以下幾點:

#include #include #include #include #include #include using namespace std;

const int max_n = 10;

const int n = 4;

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

struct node

node operator = (const node& a)

bool operator < (const node& a) const

bool operator == (const node& a) const

void opos1(int &orow1, int &ocol1) }

void opos2(int &orow2, int &ocol2)

for (int row = orow1 + 1; row <= n; row++)

for (int col = 1; col <= n; col++)

if (a[row][col] == 'o')

assert(0);

} bool canmove1(const int drow, const int dcol)

node getmove1(int drow, int dcol)

bool canmove2(const int drow, const int dcol)

node getmove2(int drow, int dcol)

bool ok()

if (ok)

return true;

} for (int col = 1; col <= n; col++)

if (ok)

return true;

} char st = a[1][1];

bool ok = true;

for (int i = 2; i <= n; i++)

if (a[i][i] != st)

if (ok)

return true;

st = a[1][n];

ok = true;

for (int row = 2, col = n - 1; row <= n; row++, col--)

if (a[row][col] != st)

return ok;

}};node start;

int bfs()

}if (cur.canmove2(dir[i][0], dir[i][1]))

}} }

return -1;

}int main()

luogu P2346 四子連棋

第一次寫搜尋一遍過,紀念一下先。論結構體的妙用,直接傳乙個陣列簡直太方便。用乙個陣列記錄當前的局面,2為白色,1為黑色,0為空格,已走的步數,下一步那一方走,1為白色,1為黑色。然後把初始局面的兩種走法都加進佇列中,並標記,這裡一定要取模,3 16有四千多萬,bool陣列也不好受 當找到乙個空白的格...

P2346 四子連棋 迭代加深

難點是想到顏色可以為o,搜尋的過程中可能會把乙個o移動到另乙個o上面,然後搜尋的顏色引數就變成o就錯了。也沒什麼好辦法,就是判到o直接跳過。另外,要習慣把各種量寫在引數表裡,這樣能省很多 也更好除錯 include include include include include include in...

洛谷P2346 四子連棋 題解 迭代加深搜尋

首先需要注意 題目描述 中說道的這句話 黑白雙方交替走棋,任意一方可以先走 然後我這邊用的是迭代加深搜尋解決的這個問題。我覺得迭代加深搜尋結合了dfs和bfs的優點 能夠像bfs一樣進行層次遍歷 使用回溯,相比bfs將所有狀態都加入佇列,迭代加深搜尋更省空間。示例 include using nam...