ZOJ2100题解这是我整整意义上的第一道DFS题能做出来我很开心,和上题一样,方法思路大体相同,不过不需要剪枝。

 1 #include<iostream>
2 #include<cstdio>
3
4 using namespace std;
5
6 char s[7][7];
7 int n, m,wall,ok;
8 int visit[7][7];
9 int si, sj;
10 int dir[4][2] = {-1,0,0,1,1,0,0,-1};//四个方向,这是做DFS常用的方法,要谨记。
11
12 int dfs(int x,int y,int num)
13 {
14 if(num==n*m-wall-1)
15 return ok = 1;
16 for (int i=0; i<4; i++)
17 {
18 int x1 = x + dir[i][0];
19 int y1 = y + dir[i][1];
20 if (x1>=1&&x1<=n&&y1>=1&&y1<=m&&visit[x1][y1]==0&&s[x1][y1]!='S')
21 {
22 visit[x1][y1] = 1;
23 dfs(x1,y1,num+1);
24 visit[x1][y1] = 0;//回溯饭标记
25 }
26 }
27 }
28
29 int main()
30 {
31 while(cin>>n>>m)
32 {
33 if(n==0 && m==0) break;
34 wall = 0;
35 for(int i=1; i<=n; i++)
36 for(int j=1; j<=m; j++)
37 {
38 cin>>s[i][j];
39 if(s[i][j]=='S')
40 {
41 wall++;
42 }
43 si = 1;
44 sj = 1;
45 visit[i][j] = 0;
46 }
47 ok = 0;
48 visit[si][sj] = 1;
49 dfs(si,sj,0);
50 if (ok == 1)
51 printf("YES\n");
52 else
53 printf("NO\n");
54 }
55 return 0;
56 }
posted @ 2011-08-24 15:22  zhongya  阅读(191)  评论(0编辑  收藏  举报