hdoj1010

来源:互联网 发布:苹果windows系统黑屏 编辑:程序博客网 时间:2024/06/10 07:54

一开始以为是bfs!!!

 

 

#include<iostream>
#include<math.h>
using namespace std;
char map[10][10];
int n,m,t;
int si,sj,ei,ej;//开始和结束的坐标
int wal,flag;
int d[4][2]={{0,-1},{0,1},{1,0},{-1,0}};

void dfs(int x,int y,int ut){//ut表示已经用的可用时间!
    if(x>n||y>m||x<=0||y<=0) return;
    if(ut==t&&x==ei&&y==ej) flag=1;
    if(flag==1)return;
    int temp=t-ut-abs(x-ei)-abs(y-ej);//x,y点到终点的最短时间是 abs(x-ei)+abs(x-ej); 剪枝!!!
    if(temp<0||temp&1) return;//if((abs(ei-x)+abs(ej-y))%2!=(t-tc)%2)return;
    //遇到从 0 走向 0 但是要求时间是奇数(坐标差之和为奇数)的,或者, 从 1 走向 0 但是要求时间是偶数的 都可以直接判断不可达!
    for(int i=0;i<4;i++){
        if(map[x+d[i][0]][y+d[i][1]]!='X')
        {//原因在于终点为D而不是'.';这也是为什么起点设成‘X’的原因
           map[x+d[i][0]][y+d[i][1]]='X';
           dfs(x+d[i][0],y+d[i][1],ut+1);
           map[x+d[i][0]][y+d[i][1]]='.';//一定要恢复!!!
           }
           
           }
           return;
    }

int main(){
    while(1){
        wal=0;
        cin>>n>>m>>t;
        if(n==0&&m==0&&t==0) break;
       
        for(int i=1;i<=n;i++)//当从0开始的时候不知道为什么硬是要超时?????
           for(int j=1;j<=m;j++)
             {
                 cin>>map[i][j];
                 if(map[i][j]=='S')
                      { si=i;sj=j;}
                  else if(map[i][j]=='D')
                       { ei=i;ej=j;}
                  else if(map[i][j]=='X')
                       {wal++;}
              }
       
       
        if(t>=m*n-wal)//剪枝
        {   cout<<"NO"<<endl;  continue;}
       
        map[si][sj]='X';
        flag=0;
        dfs(si,sj,0);
        if(flag==1)
         cout<<"YES"<<endl;
         else
          cout<<"NO"<<endl;
       
       
           }
return 0;
    }
    
    
    
    
    
    
    
    
    
   

原创粉丝点击