跳格子

描述

今天小云和小塘玩起了跳格子的游戏,小云对小塘说:

我在地上给你画一些格子,格子里面会出现下面的这些符号
‘S’ 表示你要从这个格子开始
‘X’ 表示这个格子不能跳
‘.’ 表示这个格子可以跳
‘D’ 表示跳到这个格子就结束了
然后我告诉你要跳的步数,每跳一格算一步,只能上下左右四个方向跳,跳过的格子将会马上变成‘X’,你能恰好跳到终点吗?

输入

输入包含多组测试数据,每组测试数据的第一行有三个数N,M,S(1<N,M<7;0<S<50),
分别表示格子的行数、列数和走的步数。当N,M,S均为0时表示输入结束。

输出

如果刚能跳走到终点,输出YES,不能则输出NO。

样例输入

4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0

样例输出

NO
YES

 

 

#include<iostream>
#include<cstdio>
using namespace std;
char a[100][100];
int n,m,s,x1,y1,x2,y2,xx;
int anx[5]={1,0,-1,0};//这两个数组是方向
int any[5]={0,1,0,-1};
int fun(int x,int y,int temp)
{
    if(temp<0||a[x][y]=='X')return 0;//当能走的歩数(temp)走完以后还没找到也返回
    if(x==x2&&y==y2&&temp==0)//当起点等于终点,同时步数刚好走完就代表找到了
        {
           xx=1;
           return 0;
        }
    for(int i=0;i<4;i++)//模拟四个方向,采用递归调用
    {
        int ax=x+anx[i];
        int ay=y+any[i];
        if(ax>=1&&ax<=n&&ay>=1&&ay<=m&&a[ax][ay]!='X')
        {
            a[x][y]='X';
            fun(ax,ay,temp-1);
            a[x][y]='.';
        }
    }
      return 0;
}
int main()
{

    while(~scanf("%d %d %d",&n,&m,&s))
    {
        if(n==0&&m==0&&s==0)break;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            if(a[i][j]=='S'){x1=i;y1=j;a[i][j]=='.';}//分别记住他们起点和终点坐标
             if(a[i][j]=='D'){x2=i;y2=j;a[i][j]=='.';}
        }
        xx=0;//利用xx进行判断
        fun(x1,y1,s);
        if(xx)printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值