C语言/跳跃游戏(Jump Game)

先看要求

题意理解:如题意所示,但注意 “可以跳跃的最大长度”指的是可跳跃范围!

解题思路:做法有多种,最简单的利用多重嵌套if-else if-else或多重循环嵌套(for、while等)这里就不演示了。

                通过贪心法来解决这道题,每次到达一个位置之后,我们都有一个可以选择的跳转范围,如果在这个范围里,我们可以选出最优跳跃路径(即最远可以达到哪个位置),就可以直接抛弃其他路径,进而解决下一步。如此反复,最后我们就能得出最后可以到达数组的哪个位置,因此,我们只要掌握了最后能到达哪个位置,就能知道可不可以达到数组末端了。

                思路解决了,但是我们考虑到非负数组中还有一个特殊的存在,即0。可以跳跃范围为0的话,就无法进行跳转了,停在原地。此时分有两种情况,一是我们在前往数组末端的路上遇到了0了,那么我们就不可能达到末尾了,游戏结束,输出false.。二是虽然我们遇到了0,但是我们已经在末尾了,游戏结束,但应该输出true。所以这里需要一个判定处理,


代码部分(带详细注释)

#include <stdio.h>

int main(){
	int i,j,z,index=0,insert=0;
	int a[5],b[5]={0,0,0,0,0};
	for(j=0;j<5;j++){
		scanf("%d",&a[j]);
	}
	for(i=0;i<4;i=i+index ){
	    if(a[i] == 0){		//可跳转范围为0,跳转结束
			if(i!=4){	//当可跳转范围为0,但为最后一个元素,说明已走到末尾
			    break;	//跳出循环
			}
			else
			    i=4;
	    }
	for(j=i+1;j<=a[i];j++){  //将下一步所有可走路径保存在b[]中 例如: 3 2 1 0 4 中第一个元素的下一步 3->2 3->1 3->0
		b[i]=i+a[i];		// 按照下一步的可走路径将距离值保存在b[]的 例如:3->2 3->1 3->0(随便起的名字)距离值:1+2 2+1 3+0 三者可走距离值一样  
	}
	z=sizeof(b) / sizeof(int);
	for(;z>=0;z--){       //选出最优路径 并记录元素位置即下一跳转(最优) 
		if(insert<b[z]){		//利用for()与if()选出b[]中最大值
			index = a[z];		//最优路径:当数组下标与数组元素的值之和最大时,可供选择的跳转范围最远
			insert=b[z];
		}
	}
	}
	if(i>=4){
		printf("ture\n");
	}
	else 
		printf("false\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38959715/article/details/80246800