1. 程式人生 > 實用技巧 >搜尋格式這樣寫

搜尋格式這樣寫

困擾我好久的迭代搜尋該怎麼開始結束

\(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]);
    }
}