pku 1154 DFS


网络上确实比较少这样水题的代码,但是意义还是颇大。有一篇代码用了BFS,代码比较混乱而且也看不懂,贴一段经过琢磨后,使用DFS解决的代码,在最后贴一段错误代码以比较错误地方,方便理清思路。主要思路是:每次深搜回溯后置走过的字母遍历数减一.

  1. int a[26];
  2. char b[21][21];
  3. int m,n;
  4. int DFS(int y,int x)
  5. {
  6.     int q,t;
  7.     q=0;
  8.     t=0;
  9.     if( a[b[y][x]-'A']!=0 ) return 0;
  10.     
  11.     if( (x+1)<n )
  12.     {
  13.         a[b[y][x]-'A']++;//位置错误
  14.         q=DFS(y,x+1);
  15.         a[b[y][x]-'A']--;//位置错误
  16.         if(q!=0 && t<q)
  17.         {
  18.             t=q;    
  19.         }
  20.         
  21.     }
  22.     if( (y+1)<m )
  23.     {
  24.         a[b[y][x]-'A']++;
  25.         q=DFS(y+1,x);
  26.         a[b[y][x]-'A']--;
  27.         if(q!=0 && t<q)
  28.         {
  29.             t=q;
  30.             
  31.         }
  32.         
  33.     }
  34.     if((x-1)>=0)
  35.     {
  36.         a[b[y][x]-'A']++;
  37.         q=DFS(y,x-1);
  38.         a[b[y][x]-'A']--;
  39.         if(q!=0 && t<q)
  40.         {
  41.             t=q;
  42.             
  43.         }
  44.         
  45.     }
  46.     if((y-1)>=0)
  47.     {
  48.         a[b[y][x]-'A']++;
  49.         q=DFS(y-1,x);
  50.         a[b[y][x]-'A']--;
  51.         if(q!=0 && t<q)
  52.         {
  53.             t=q;
  54.             
  55.         }       
  56.         
  57.     }
  58.     return t=t+1;
  59. }
  60. int main()
  61. {
  62.     int i,j,k;
  63.     while(cin>>m>>n)
  64.     {
  65.         memset(a,0,sizeof(int)*26);
  66.         for(j=0;j<m;j++)
  67.             for(i=0;i<n;i++)
  68.             {
  69.                 cin>>b[j][i];
  70.             }
  71.             k=DFS(0,0);
  72.             cout<<k<<endl;
  73.     }
  74.     return 0;
  75. }


一直WA的代码:
第一次修改后的错误:
  1. int a[26];
  2. char b[21][21];
  3. int m,n;
  4. int DFS(int y,int x)
  5. {
  6.     int q,t;
  7.     q=0;
  8.     t=0;
  9.     if( a[b[y][x]-'A']!=0 ) return 0;
  10.     a[b[y][x]-'A']++;//位置错误
  11.     if( (x+1)<n )
  12.     {
  13.         
  14.         q=DFS(y,x+1);
  15.         if(q!=0 && t<q)
  16.         {
  17.             t=q;   
  18.             a[b[y][x]-'A']--;     
  19.         }
  20.         
  21.     }
  22.     if( (y+1)<m )
  23.     {
  24.     
  25.         q=DFS(y+1,x);
  26.        
  27.         if(q!=0 && t<q)
  28.         {
  29.             t=q;
  30.              a[b[y][x]-'A']--;
  31.         }
  32.         
  33.     }
  34.     if((x-1)>=0)
  35.     {
  36.         
  37.         q=DFS(y,x-1);
  38.         
  39.         if(q!=0 && t<q)
  40.         {
  41.             t=q;
  42.             a[b[y][x]-'A']--;
  43.         }
  44.         
  45.     }
  46.     if((y-1)>=0)
  47.     {
  48.       
  49.         q=DFS(y-1,x);
  50.         
  51.         if(q!=0 && t<q)
  52.         {
  53.             t=q;
  54.             a[b[y][x]-'A']--;
  55.         }       
  56.         
  57.     }
  58.     return t=t+1;
  59. }
  60. int main()
  61. {
  62.     int i,j,k;
  63.     while(cin>>m>>n)
  64.     {
  65.         memset(a,0,sizeof(int)*26);
  66.         for(j=0;j<m;j++)
  67.             for(i=0;i<n;i++)
  68.             {
  69.                 cin>>b[j][i];
  70.             }
  71.             k=DFS(0,0);
  72.             cout<<k<<endl;
  73.     }
  74.     return 0;
  75. }


第二次修改后的错误:
  1. int a[26];
  2. char b[21][21];
  3. int m,n;
  4. int DFS(int y,int x)
  5. {
  6.     int q,t;
  7.     q=0;
  8.     t=0;
  9.     if( a[b[y][x]-'A']!=0 ) return 0;
  10.     
  11.     if( (x+1)<n )
  12.     {
  13.         a[b[y][x]-'A']++;//位置错误
  14.         q=DFS(y,x+1);
  15.         if(q!=0 && t<q)
  16.         {
  17.             t=q;   
  18.             a[b[y][x]-'A']--;     
  19.         }
  20.         
  21.     }
  22.     if( (y+1)<m )
  23.     {
  24.         a[b[y][x]-'A']++;
  25.         q=DFS(y+1,x);
  26.        
  27.         if(q!=0 && t<q)
  28.         {
  29.             t=q;
  30.              a[b[y][x]-'A']--;
  31.         }
  32.         
  33.     }
  34.     if((x-1)>=0)
  35.     {
  36.         a[b[y][x]-'A']++;
  37.         q=DFS(y,x-1);
  38.         
  39.         if(q!=0 && t<q)
  40.         {
  41.             t=q;
  42.             a[b[y][x]-'A']--;
  43.         }
  44.         
  45.     }
  46.     if((y-1)>=0)
  47.     {
  48.         a[b[y][x]-'A']++;
  49.         q=DFS(y-1,x);
  50.         
  51.         if(q!=0 && t<q)
  52.         {
  53.             t=q;
  54.             a[b[y][x]-'A']--;
  55.         }       
  56.         
  57.     }
  58.     return t=t+1;
  59. }
  60. int main()
  61. {
  62.     int i,j,k;
  63.     while(cin>>m>>n)
  64.     {
  65.         memset(a,0,sizeof(int)*26);
  66.         for(j=0;j<m;j++)
  67.             for(i=0;i<n;i++)
  68.             {
  69.                 cin>>b[j][i];
  70.             }
  71.             k=DFS(0,0);
  72.             cout<<k<<endl;
  73.     }
  74.     return 0;
  75. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值