搜尋格式這樣寫
阿新 • • 發佈:2020-12-02
困擾我好久的迭代搜尋該怎麼開始結束
從\(step == 0\) 開始
到\(step == k\) 判斷 是否合法結束
迴圈裡邊這麼寫
for(.... ) {
...........;//操作
dfs(step + 1);
...........;//回溯
}
也就是說先動在搜
\(step == 0\) 處理 第一次
\(step == 1\) 處理 第二次
\(step == k - 1\) 處理 第k次
\(step == k\) 處理 第k + 1次
但是 k + 1 就應該退出
關於估價函式什麼的
直接記住下邊的板子
test(int step) { .....; if(++cnt + step > k) return false; .....; } dfs(int step) { if(step == k) { if(check()); return ;} for(....) { ....;//操作 if(test(step)) dfs(step + 1); ....;//回溯 } }
比如說那個八數碼難題
//niiick char ss[15]; int ans[4][4]= {{0,0,0,0}, {0,1,2,3}, {0,8,0,4}, {0,7,6,5}}; int a[5][5],k,judge; int nxtx[]={0,1,-1,0}; int nxty[]={1,0,0,-1}; int check() { for(int i=1;i<=3;++i) for(int j=1;j<=3;++j) if(ans[i][j]!=a[i][j])return 0; return 1; } int test(int step) { int cnt=0; for(int i=1;i<=3;++i) for(int j=1;j<=3;++j) if(ans[i][j]!=a[i][j]){ if(++cnt+step>k) return 0;} return 1; } void A_star(int step,int x,int y,int pre) { if(step==k){ if(check())judge=1; return;}//達到當前限制的最大深度 if(judge) return; for(int i=0;i<4;++i) { int nx=x+nxtx[i],ny=y+nxty[i]; if(nx<1||nx>3||ny<1||ny>3||pre+i==3) continue;//加入了上述最優性剪枝 swap(a[x][y],a[nx][ny]); if(test(step)&&!judge) A_star(step+1,nx,ny,i);//A*估價合法再向下搜尋 swap(a[x][y],a[nx][ny]); } }