网络上确实比较少这样水题的代码,但是意义还是颇大。有一篇代码用了BFS,代码比较混乱而且也看不懂,贴一段经过琢磨后,使用DFS解决的代码,在最后贴一段错误代码以比较错误地方,方便理清思路。主要思路是:每次深搜回溯后置走过的字母遍历数减一.
- int a[26];
- char b[21][21];
- int m,n;
- int DFS(int y,int x)
- {
- int q,t;
- q=0;
- t=0;
- if( a[b[y][x]-'A']!=0 ) return 0;
- if( (x+1)<n )
- {
- a[b[y][x]-'A']++;//位置错误
- q=DFS(y,x+1);
- a[b[y][x]-'A']--;//位置错误
- if(q!=0 && t<q)
- {
- t=q;
- }
- }
- if( (y+1)<m )
- {
- a[b[y][x]-'A']++;
- q=DFS(y+1,x);
- a[b[y][x]-'A']--;
- if(q!=0 && t<q)
- {
- t=q;
- }
- }
- if((x-1)>=0)
- {
- a[b[y][x]-'A']++;
- q=DFS(y,x-1);
- a[b[y][x]-'A']--;
- if(q!=0 && t<q)
- {
- t=q;
- }
- }
- if((y-1)>=0)
- {
- a[b[y][x]-'A']++;
- q=DFS(y-1,x);
- a[b[y][x]-'A']--;
- if(q!=0 && t<q)
- {
- t=q;
- }
- }
- return t=t+1;
- }
- int main()
- {
- int i,j,k;
- while(cin>>m>>n)
- {
- memset(a,0,sizeof(int)*26);
- for(j=0;j<m;j++)
- for(i=0;i<n;i++)
- {
- cin>>b[j][i];
- }
- k=DFS(0,0);
- cout<<k<<endl;
- }
- return 0;
- }
第一次修改后的错误:
- int a[26];
- char b[21][21];
- int m,n;
- int DFS(int y,int x)
- {
- int q,t;
- q=0;
- t=0;
- if( a[b[y][x]-'A']!=0 ) return 0;
- a[b[y][x]-'A']++;//位置错误
- if( (x+1)<n )
- {
- q=DFS(y,x+1);
- if(q!=0 && t<q)
- {
- t=q;
- a[b[y][x]-'A']--;
- }
- }
- if( (y+1)<m )
- {
- q=DFS(y+1,x);
- if(q!=0 && t<q)
- {
- t=q;
- a[b[y][x]-'A']--;
- }
- }
- if((x-1)>=0)
- {
- q=DFS(y,x-1);
- if(q!=0 && t<q)
- {
- t=q;
- a[b[y][x]-'A']--;
- }
- }
- if((y-1)>=0)
- {
- q=DFS(y-1,x);
- if(q!=0 && t<q)
- {
- t=q;
- a[b[y][x]-'A']--;
- }
- }
- return t=t+1;
- }
- int main()
- {
- int i,j,k;
- while(cin>>m>>n)
- {
- memset(a,0,sizeof(int)*26);
- for(j=0;j<m;j++)
- for(i=0;i<n;i++)
- {
- cin>>b[j][i];
- }
- k=DFS(0,0);
- cout<<k<<endl;
- }
- return 0;
- }
第二次修改后的错误:
- int a[26];
- char b[21][21];
- int m,n;
- int DFS(int y,int x)
- {
- int q,t;
- q=0;
- t=0;
- if( a[b[y][x]-'A']!=0 ) return 0;
- if( (x+1)<n )
- {
- a[b[y][x]-'A']++;//位置错误
- q=DFS(y,x+1);
- if(q!=0 && t<q)
- {
- t=q;
- a[b[y][x]-'A']--;
- }
- }
- if( (y+1)<m )
- {
- a[b[y][x]-'A']++;
- q=DFS(y+1,x);
- if(q!=0 && t<q)
- {
- t=q;
- a[b[y][x]-'A']--;
- }
- }
- if((x-1)>=0)
- {
- a[b[y][x]-'A']++;
- q=DFS(y,x-1);
- if(q!=0 && t<q)
- {
- t=q;
- a[b[y][x]-'A']--;
- }
- }
- if((y-1)>=0)
- {
- a[b[y][x]-'A']++;
- q=DFS(y-1,x);
- if(q!=0 && t<q)
- {
- t=q;
- a[b[y][x]-'A']--;
- }
- }
- return t=t+1;
- }
- int main()
- {
- int i,j,k;
- while(cin>>m>>n)
- {
- memset(a,0,sizeof(int)*26);
- for(j=0;j<m;j++)
- for(i=0;i<n;i++)
- {
- cin>>b[j][i];
- }
- k=DFS(0,0);
- cout<<k<<endl;
- }
- return 0;
- }