描述
今天小云和小塘玩起了跳格子的游戏,小云对小塘说:
我在地上给你画一些格子,格子里面会出现下面的这些符号
‘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; }