杭电1010

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int n,m,t,flag;
int starx,stary,doorx,doory,wallnumber;
int movex[]={0,-1,0,1},movey[]={-1,0,1,0};
char maze[7][7];
void dfs(int,int,int);  //深搜
int main()
{
 int i,j;
 while(scanf("%d %d %d",&n,&m,&t)!=EOF && !(n==0 && m==0 && t==0))
 {
  getchar();  //吸收回车
  wallnumber=0;
  flag=0;
  for(i=0;i<n;i++)
  {
   for(j=0;j<m;j++)
   {
    scanf("%c",&maze[i][j]);
    if(maze[i][j]=='S')   //记录小狗的起始位置
    {
                   starx=i;
       stary=j;
       maze[starx][stary]='X';  //注意起点位置的标记,容易遗漏
    }
    else if(maze[i][j]=='D')  //记录门的位置
    {
     doorx=i;
     doory=j;
    }
    else if(maze[i][j]=='X')
     wallnumber++;  //记录墙的数量
   }
   getchar();   //吸收回车
  }
  if(n*m-wallnumber>=t)  //当可以走的街区数大于时间才进入搜索
  {
   dfs(starx,stary,0);
  }
  if(flag) printf("YES\n");
  else printf("NO\n");
 }
 return 0;
}
void dfs(int sx,int sy,int startime)
{
 int i,time;
 if(sx==doorx && sy==doory && startime==t)
 {flag=1;return;}
    time=t-startime-abs(sx-doorx)-abs(sy-doory);   //time为剩余时间
    if(time<0 || time%2!=0)  //剪掉奇数枝
    return;
 for(i=0;i<4;i++)  //上下左右四个方向
 {
  if(sx+movex[i]<0||sx+movex[i]>n-1||sy+movey[i]<0||sy+movey[i]>m-1)  //注意边界问题:是>n-1,m-1
   continue;
  if(maze[sx+movex[i]][sy+movey[i]]!='X')
  {
   maze[sx+movex[i]][sy+movey[i]]='X';
   dfs(sx+movex[i],sy+movey[i],startime+1);  //注意此时startime+1和startime++的区别
            maze[sx+movex[i]][sy+movey[i]]='.';  //遍历后还原
  }
  if(flag) break;
 }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值