题目1461:Tempter of the bone

12 篇文章 0 订阅
#include<stdio.h>
char maze[8][8];        // 保存地图信息
int n,m,t;              // 地图大小为n*m,从起点到终点能否恰好为t秒
bool success;           // 是否找到所需状态标记
int go[][2]={1,0,-1,0,0,1,0,-1};      // 四方向行走坐标差
void DFS(int x,int y,int time){       // 递归形式的深度优先搜索 
    for(int i=0;i<4;i++){             // 枚举四个相邻位置 
        int nx=x+go[i][0];    
        int ny=y+go[i][1];
        if(nx<1 || nx>n || ny<1 || ny>m)  continue;       // 若坐标在地图外则跳过 
        if(maze[nx][ny]=='X') continue;                   // 若该位置为墙,则跳过
        if(maze[nx][ny]=='D'){        // 若该位置为门 
            if(time+1==t) {           // 若所用时间恰好为t 
                success=true;         // 搜索成功 
                return ;    
            }    
            else continue; 
        } 
        maze[nx][ny]='X';             // 该状态扩展而来的后续状态中,该位置都不能被经过 
        DFS(nx,ny,time+1);
        maze[nx][ny]='.';             // 若其后续状态全部遍历完毕,则退回上层状态,
                                      // 将因为要搜索其后续状态而改成墙的位置,改回普通位置 
        if(success)    return ;
    }

int main()
{
    while(scanf("%d%d%d",&n,&m,&t)!=EOF){
        if(n==0 && m==0 && t==0) break;
        for(int i=1;i<=n;i++) scanf("%s",maze[i]+1);
        success=false;
        int sx,sy;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(maze[i][j]=='D') {sx=i;sy=j;}    
            }    
        }    
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(maze[i][j]=='S' && (i+j)%2==((sx+sy)%2+t%2)%2){
                // 找到S点后,先判断S与D的奇偶性关系,是否和t符合,若不符合则跳过 
                    maze[i][j]='X';
                    DFS(i,j,0);    
                }    
            }
        }
        puts(success==true ? "YES" : "NO");
    }
    return 0;    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值