luogu P2346 四子連棋

2022-08-13 09:03:14 字數 1183 閱讀 6927

第一次寫搜尋一遍過,紀念一下先。

論結構體的妙用,直接傳乙個陣列簡直太方便。用乙個陣列記錄當前的局面,2為白色,1為黑色,0為空格,已走的步數,下一步那一方走,1為白色,-1為黑色。

然後把初始局面的兩種走法都加進佇列中,並標記,這裡一定要取模,3^16有四千多萬,bool陣列也不好受

當找到乙個空白的格仔時,就試試能否移動,如果移動後能形成乙個新局面,就加進佇列,加進佇列之前可以先特判一下是否能結束。雖然是廣搜,但是還是要把局面恢復。

#include#include

#include

const

int c=1000007

;using

namespace

std;

char s[10

];struct

matstb,stw;

bool b[2000005][3

];int

sum;

int nx[5]=;

int ny[5]=;

queue

q;int vis(mat x,int

ns) sum%=c;

if(b[sum][ns+1]==1) return1;

else

}int

win(mat x)

void move(mat g,int x,int y,int

ns)

if(vis(t,ns)==0

) q.push(t);

t.c[tx][ty]=t.c[x][y];

t.c[x][y]=0

; }

}}void

bfs()}}

}int

main()

if(s[j-1]=='w'

)

if(s[j-1]=='b'

) }}

stb.nxt=-1

; stw.nxt=1

; vis(stw,

1);vis(stb,-1

); bfs();

return0;

}

luogu2346 四子連棋

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

P2346 四子連棋 迭代加深

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

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

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