2013-3-17 集训 Problem H: 跳格子 搜索

跳格子游戏算法解析
本文介绍了一款跳格子游戏的算法实现过程,玩家需根据特定规则从起点(S)跳至终点(D),途中需避开障碍(X)并在有限步数内到达目标。文章通过示例详细解释了如何通过更新周围格子的步数来判断是否能成功抵达。

点击打开链接

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点的位置是不是更新到要走的位置了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值