首页 新闻 会员 周边 捐助

关于回溯法的一道编程题,有处地方不明白(已经打问号说明),希望能得到详细解释

0
[待解决问题]

#include <stdio.h>
     char map[4][4];
     int best,n;
     int canput(int row, int col)
     {
        int i;
        for (i = row - 1; i >= 0; i--)
        {
          if (map[i][col] == 'o') return 0;
          if (map[i][col] == 'x') break;
        }
        for (i = col - 1; i >= 0; i--)
        {
          if (map[row][i] == 'o') return 0;
          if (map[row][i] == 'x') break;
        }
        return 1;
     }
 
     void solve(int k,int tot)
     {
        int x,y;
        if(k==n*n)
        {
          if(tot>best)
          {
           best=tot;   return;
          }
        }
        else
        {
          x=k/n;
          y=k%n;
          if((map[x][y]=='.') && (canput(x,y) ) )
          {
            map[x][y]='o';
            solve(k+1,tot+1);
            map[x][y]='.';  ??为什么要加这句语句
          }
         solve(k+1,tot);
         }
      }
 
     int main()
     {
        int i,j;
        scanf("%d",&n);
        while(n>0)
        {
          for(i=0;i< n;i++)
             for(j=0;j< n;j++)
                 scanf("%1s",&map[i][j]);
          best=0;
          solve(0,0);
          printf("%d\n",best);
          n=0;                            
          scanf("%d",&n);
        }
        return 0;
 }

ruan875417的主页 ruan875417 | 初学一级 | 园豆:200
提问于:2012-02-21 20:49
< >
分享
所有回答(2)
0
dudu | 园豆:29568 (高人七级) | 2012-02-22 10:37
0

没来得及细看,因为你并未给出情景,我只看了你画的这部分,回溯有一个特征是返回上一状态,当map[x][y]=='.' && (canput(x,y)  时,回溯进行下一步  solve(k+1,tot+1); 这一步就让回溯进去了,将所有的这种可能进行遍历完,遍历完后要恢复状态 map[x][y]='.';

 

  if((map[x][y]=='.' && (canput(x,y) ) )
          {
            map[x][y]='o';
            solve(k+1,tot+1);
            map[x][y]='.';  ??为什么要加这句语句
          }

草莓在努力 | 园豆:205 (菜鸟二级) | 2012-03-19 10:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册