POJ 1154题解,此题不难理解方法就是DFS,属于水题。不过有一些细节要注意。
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 }