1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<iostream>
 5 
 6 using namespace std;
 7 
 8 char map[30][30];
 9 int vis[30];  
10 int dir[4][2] = {1,0,-1,0,0,-1,0,1}; //搜索的四个方向,这里用数组表示,为了下面表示方便
11 int ans, row, col, loc; //loc表示搜索的深度。
12 
13 int Inmap(int nr,int nc)  //判断搜索的条件,也可直接写在DFS内,这里为了避免一行的代码过于冗长。
14 {
15    if (nr >= 0 && nr < row && nc >= 0 && nc < col)
16    {
17      return 1;
18    }
19    return 0;
20 }
21 void DFS(int r,int c) //无返回值就用void.
22 {
23      int i,nr,nc;
24    if (loc > ans)
25    {
26       ans=loc;//对ans的值进行更新,它的值就是搜索的深度。
27    }
28  
29    for ( i=0;i<4;i++)
30    {
31       nr=r+dir[i][0];
32       nc=c+dir[i][1];
33      if (Inmap(nr,nc) && !vis[map[nr][nc]-'A'])
34      {
35         vis[map[nr][nc]-'A']=1;//将访问过的字符标记为1,相同的字符就不会再被标记。
36         loc++;//深度加1
37         DFS(nr,nc);
38         vis[map[nr][nc]-'A']=0;回溯反标记
39         loc--; //回溯后深度会减小1这里要减掉1.
40      }
41    }
42 }
43 int main(void)
44 { 
45    int i, j;
46       
47    while( cin >> row >> col ) 
48    {
49       getchar();//处理换行字符不能省略,否则会WA。
50       ans = 1;
51       loc = 1; //将两个变量赋值为1,因为搜索深度至少为1.
52       memset(vis,0,sizeof(vis));
53       for ( i=0;i<row;i++)
54       {
55         for(j=0; j<col; j++)
56         {
57           cin>>map[i][j];
58         }
59         getchar();
60       }
61       vis[map[0][0]-'A']=1;
62       DFS(0,0);
63       cout<< ans <<endl;
64   }
65    return 0;
66 }