HDU 1010

真正搜索意义上的第一题、

开始因为标志变量flag没有重置为0、

导致WA了两次呢、吸取教训了

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 using namespace std;
 6 int flag,di,dj,n,m,t;
 7 char map[10][10];
 8 int dir[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
 9 void dfs(int si,int sj,int cnt)
10 {
11     if(si<1||sj<1||si>n||sj>m)    return;
12     if(cnt==t&&si==di&&sj==dj)    flag=1;
13     if(flag)    return;
14     int temp=t-cnt-(abs(si-di)+abs(sj-dj));
15     if(temp<0||temp&1)    return;                //这里temp&1 还不清楚是什么意义... 有哪位大神可以告诉我吗 
16     for(int i=0;i<4;++i){
17         if(map[si+dir[i][0]][sj+dir[i][1]]!='X'){
18             map[si+dir[i][0]][sj+dir[i][1]]='X';
19             dfs(si+dir[i][0],sj+dir[i][1],cnt+1);
20             map[si+dir[i][0]][sj+dir[i][1]]='.';
21         }
22     }
23     return;
24 }
25 int main()
26 {    
27     while(cin >> n >> m >> t && m&&n&&t){
28         flag=0;
29         int si,sj;
30         int wall=0; 
31         for(int j,i=1;i<=n;++i){
32             for(j=1;j<=m;++j){
33                 cin >> map[i][j];
34                 if(map[i][j]=='X')    ++wall;
35                 else if(map[i][j]=='D')    {di=i;dj=j;}
36                 else if(map[i][j]=='S'){si=i;sj=j;}
37             }
38         }
39         if(n*m-wall<=t){                //还有这里为什么不是小于t 
40             cout << "NO" << endl;
41             continue;
42         }
43         map[si][sj]='X';
44         dfs(si,sj,0);
45         if(flag)    cout << "YES" << endl;
46         else        cout << "NO" << endl;
47     }
48     return 0;
49 }

 

posted @ 2016-01-16 09:33  我不萌、我要高冷  阅读(253)  评论(0编辑  收藏  举报