Description
今天小云和小塘玩起了跳格子的游戏,小云对小塘说:
我在地上给你画一些格子,格子里面会出现下面的这些符号
‘S’ 表示你要从这个格子开始
‘X’ 表示这个格子不能跳
‘.’ 表示这个格子可以跳
‘D’ 表示跳到这个格子就结束了
然后我告诉你要跳的步数,每跳一格算一步,只能上下左右四个方向跳,跳过的格子将会马上变成‘X’,你能恰好跳到终点吗?
Input
输入包含多组测试数据,每组测试数据的第一行有三个数N,M,S(1<N,M<7;0<S<50),
分别表示格子的行数、列数和走的步数。当N,M,S均为0时表示输入结束。
Output
如果能刚跳走到终点,输出YES,不能则输出NO。
Sample Input
4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
.
.X.
...D
0 0 0
Sample Output
NO
YES
搜索吧~当时木有做出来~~貌似这种题都是给羽哥和老汪做的~~
自己从新写了一遍,每次更新周边的步数,看最后的D点的位置是不是更新到要走的位置了
#include<stdio.h>
#include<string.h>
char a[10][10];
int f[10][10];
int up[5] ={1,0,0,-1}; //上下左右四个方向
int down[5]={0,1,-1,0};
void fun(int i,int j,int rec){ //更新周边的步数
int k;
for(k=0;k<4;k++)
if( (a[i+up[k]][j+down[k]]=='.')||(a[i+up[k]][j+down[k]]=='D') )
f[i+up[k]][j+down[k]]=rec;
}
int main()
{
int n,m,s;
// freopen("a.txt","r",stdin); //以后就从文件读入了
while(scanf("%d%d%d",&n,&m,&s)&&(n!=0)){
getchar();
int i,j,k,sx,sy,dx,dy; //s记录起点 d记录终点坐标
memset(a,'X',sizeof(a));
memset(f,0,sizeof(f));
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%c",&a[i][j]);
if(a[i][j]=='S'){
sx=i;
sy=j;
}
if(a[i][j]=='D'){
dx=i;
dy=j;
}
}
getchar();
}
f[sx][sy]=1; //f数组记录得到的步数 每次更新记录的步数
int ans=s+1;
for(k=1;k<=s;k++){
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(f[i][j]==k)fun(i,j,k+1);
}
}
}
if(f[dx][dy]==ans)printf("YES\n"); //看看这个步数是不是达到了~~
else printf("NO\n");
}
}
这是简单的算法~~其实
不会出现
220
330
000
两个2连在一起更新的情况,按上面这种情况会更新时改变3的位置
若出现这样 在赋值个另一个数组即可~~~
搜索吧~当时木有做出来~~貌似这种题都是给羽哥和老汪做的~~
自己从新写了一遍,每次更新周边的步数,看最后的D点的位置是不是更新到要走的位置了