描述
今天小云和小塘玩起了跳格子的游戏,小云对小塘说:
我在地上给你画一些格子,格子里面会出现下面的这些符号
‘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
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0
样例输出
NO
YES
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;
}