杭电1010题

//迷宫求解问题
//思路:深度优先搜索
#include <iostream>
#include <math.h>
using namespace std;
#define max 8
char map[max][max];
int axisx[]={0,-1,0,1}; //代表行上的偏移
int axisy[]={-1,0,1,0}; //代表列上的偏移
int dx,dy;
int t;
int n,m;
bool escape;
void dfs(int sx,int sy,int cnt) //cnt代表现在已经过的时间
{
 if(sx == dx && sy == dy && cnt==t)
 {
  escape = true;
  return;
 }
 int temp = (t-cnt)-abs(sx-dx)-abs(sy-dy); 
 if(temp<0 || temp&1)  //temp<0代表剩余的时间无法走完剩余的路程 temp&1是进行奇偶剪枝
 {
  escape = false;
  return;
 }
 for(int i=0;i<4;++i)
 {
  if(sx+axisx[i]<0 || sx+axisx[i]>n-1 || sy+axisy[i]<0 || sy+axisy[i]>m-1)
   continue;  
  if(map[sx+axisx[i]][sy+axisy[i]]!='X')
  {
   map[sx+axisx[i]][sy+axisy[i]] = 'X';
   dfs(sx+axisx[i],sy+axisy[i],cnt+1);
   map[sx+axisx[i]][sy+axisy[i]] = '.'; //别忘了深度优先遍历之后进行还原
  }
  if(escape)
   break;
 }
}
int main()
{
 //freopen("1.txt","r",stdin);
 while(cin>>n>>m>>t && !(n==0 && m==0 && t==0))
 {
  escape = false;
  int sx,sy;    //sx代表sx行,sy代表sy列
  int wallnum = 0;
  for(int i1=0;i1<n;++i1)  //第i1行
  {
   for(int i2=0;i2<m;++i2) //第i2列
   {
    cin>>map[i1][i2];
    if(map[i1][i2]=='S')
    {
     sx = i1; 
     sy = i2;
     map[sx][sy] = 'X';
    }
    else if(map[i1][i2]=='D')
    {
     dx = i1;
     dy = i2;
    }
    else if(map[i1][i2]=='X')
     wallnum++;
   }      
  }
  if(!(n*m-wallnum<t)) //剩下的block块数小于时间则进行剪枝
  {
   dfs(sx,sy,0);
  }
  if(escape)
   cout<<"YES"<<endl;
  else
   cout<<"NO"<<endl;
 }
 //fclose(stdin);
 return 0;
}

你可能感兴趣的:(杭电)