HDOJ1010

来源:互联网 发布:开源行情软件 编辑:程序博客网 时间:2024/06/18 07:45
对深搜一直头疼,那这个例子给自己当个模板吧,当然,代码是网友大神的,原文地址:http://www.cnblogs.com/linpeidong2009/archive/2012/04/07/2436284.html。
#include<iostream>#include<math.h>using namespace std;char map[10][10];int N,M,T;int di,dj,escape;int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};//左右下上四个方向void dfs(int x,int y,int cnt)//cnt为已耗时间{      if(x>N || y>M || x<1 || y<1 )          return;      if(cnt==T && x==di && y==dj)          escape=1;      if(escape==1)//没有这个会超时。。。          return;      int temp=(T-cnt)-abs(x-di)-abs(y-dj);//      if(temp<0||temp&1) //步长优化与奇偶优化          return;      for(int i=0;i<4;i++)      {          if(map[x+dir[i][0]][y+dir[i][1]]!='X')          {              map[x+dir[i][0]][y+dir[i][1]]='X';              dfs(x+dir[i][0],y+dir[i][1],cnt+1);              map[x+dir[i][0]][y+dir[i][1]]='.';//回退恢复          }      }      return;}int main(){while(1)      {          int wall=0;          cin>>N>>M>>T;          if(N==0 && M==0 && T==0)              break;          int si,sj;          for(int i=1;i<=N;i++)              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')                  {                      di=i;dj=j;                  }                  else if(map[i][j]=='X')                      wall++;              }          if(T>=M*N-wall)          {                    cout<<"NO"<<endl;              continue;          }          map[si][sj]='X';          escape=0;          dfs(si,sj,0);          if(escape==1)              cout<<"YES"<<endl;          else              cout<<"NO"<<endl;      }}