hdu 1312 Red and Black

  这道是搜索水题,dfs,bfs都可以,一开始我用dfs,可是竟然出了很多错误,后来看清样例才发现题目原来是先输入列再输入行的,我说有必要这样卡别人么,然后深搜测试样例时也爆栈了(毕竟搜索类的题目基本没碰过),要记得每次访问完某个结点都要做标记的!(不然就无限递归了~)这道题我对边界都做了标记,所以深搜时免去了对于边界的繁琐的判断:

 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 

 6 char c[23][23];

 7 int n,m;

 8 

 9 int dfs(int i, int j)

10 {

11     if(c[i][j]=='#')    return 0;

12     c[i][j]= '#';

13     return  dfs(i-1,j)+dfs(i+1,j)+dfs(i,j-1)+dfs(i,j+1)+1;

14 }

15 

16 int main(){

17     int i,j,ti,tj;

18     while(~scanf("%d%d",&m,&n) && m){

19         getchar();

20         memset(c,'#',sizeof(c));

21         for(i=1; i<=n; ++i,getchar())

22             for(j=1; j<=m; ++j)

23                 if((c[i][j]= getchar())=='@')    ti= i,    tj= j;    

24         printf("%d\n",dfs(ti,tj));

25     }

26     return 0;

27 }
View Code

  看了别人的讨论后,发现bfs也可以做,同样的一定要对已访问过的结点做标记!(就是在这儿卡了好久,幸好用了一种奇葩的调试方法,能够看清每次入队的结点,见注释~):

 1 #include<cstdio>

 2 #include<cstring>

 3 #include<cstdlib>

 4 #include<queue>

 5 #include<algorithm>

 6 using namespace std;

 7 

 8 char s[23][23];

 9 

10 struct node{

11     int x,y;

12     node(int x= 0, int y= 0): x(x),y(y) {}

13 };

14 

15 int main(){

16     int n,m,ti,tj;

17     while(~scanf("%d%d",&m,&n),m){

18         memset(s,'#',sizeof(s));

19         getchar();

20         for(int i=1; i<=n; ++i,getchar())

21             for(int j=1; j<=m; ++j)

22                 if((s[i][j]= getchar())=='@')    ti= i,    tj= j;

23         int ans= 0;

24         queue<node> q;

25         q.push(node(ti,tj));

26         s[ti][tj]= '#';

27         while(!q.empty()){

28             node t= q.front();    q.pop();

29             if(s[t.x-1][t.y]=='.'){

30                 q.push(node(t.x-1,t.y));

31                 s[t.x-1][t.y]= '#';

32         //        printf("%d %d\n",t.x-1, t.y);

33             }

34             if(s[t.x+1][t.y]=='.'){

35                 q.push(node(t.x+1,t.y));

36                 s[t.x+1][t.y]= '#';

37         //        printf("%d %d\n",t.x+1, t.y);

38             }

39             if(s[t.x][t.y-1]=='.'){

40                 q.push(node(t.x,t.y-1));

41                 s[t.x][t.y-1]= '#';

42         //        printf("%d %d\n",t.x, t.y-1);

43             }

44             if(s[t.x][t.y+1]=='.'){

45                 q.push(node(t.x,t.y+1));

46                 s[t.x][t.y+1]= '#';

47         //        printf("%d %d\n",t.x, t.y+1);

48             }

49             ++ans;

50         //    system("pause");

51         }

52         printf("%d\n",ans);

53     }

54     return 0;

55 }
View Code

   还是写整洁一点吧:

 1 #include<cstdio>

 2 #include<cstring>

 3 #include<cstdlib>

 4 #include<queue>

 5 #include<algorithm>

 6 using namespace std;

 7 

 8 char s[23][23];

 9 int dir[2][4]= {{-1,0,0,1},{0,-1,1,0}};

10 

11 struct node{

12     int x,y;

13     node(int x= 0, int y= 0): x(x),y(y) {}

14 };

15 

16 int main(){

17     int n,m,ti,tj;

18     while(~scanf("%d%d",&m,&n),m){

19         memset(s,'#',sizeof(s));

20         getchar();

21         for(int i=1; i<=n; ++i,getchar())

22             for(int j=1; j<=m; ++j)

23                 if((s[i][j]= getchar())=='@')    ti= i,    tj= j;

24         int ans= 0;

25         queue<node> q;

26         q.push(node(ti,tj));

27         s[ti][tj]= '#';

28         while(!q.empty()){

29             node t= q.front();    q.pop();

30             for(int k=0; k<4; ++k){

31                 int dx= t.x+dir[0][k], dy= t.y+dir[1][k];

32                 if(s[dx][dy]=='.'){

33                     s[dx][dy]= '#';

34                     q.push(node(dx,dy));

35                 }

36             }

37             ++ans;

38         }

39         printf("%d\n",ans);

40     }

41     return 0;

42 }
View Code

你可能感兴趣的:(HDU)