问题描述
小明最近迷上了一种数字游戏,指定给出一组正整数,游戏规则是从第一个数向最后一个数进行跳跃,
选出一条跳跃次数最短的路径(如果有多条,选出一条即可,并记录跳跃次数)。每次跳跃长度至少为1,每个数字的值
表示可以从当前位置可以跳跃的最大长度。
输入:
一组正整数数字。
输出:
从第一个数跳到最后一个数的跳跃次数及每次的落点数字。
样例输入:
3, 1, 4, 1, 1, 5, 2, 1, 1, 6
样例输出:
3
3, 4, 5, 6
实现代码:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define ARRAYSIZE 100
int main()
{
int array[ARRAYSIZE];
int dropPointNum[ARRAYSIZE];
char c;
int size = 0;
int jumpInterval; /*跳跃间隔*/
int max;
int index = 0;
int nodeCount = 0;
int interval = 0;
int flag; /*记录跳跃点的下标*/
int pointPos = 0;
int firstNum = 0;
/*由于要读入一组个数未知的整数,我想把它们放在数组里。先读入一个数,然后在用getchar读取剩下所有*/
while(scanf("%d", &firstNum) != EOF)
{
/*清空数组,避免下次循环的干扰*/
memset(array, 0 , ARRAYSIZE);
memset(dropPointNum, 0 , ARRAYSIZE);
/*******************************/
/*读取一组整数,并存入数组array*/
/*******************************/
/*第一个读进来的数也要放入数组里*/
array[size++] = firstNum;
while((c = getchar()) != '\n'){ /*没遇到换行符就一直读*/
if(isdigit(c)){
ungetc(c, stdin); /*把c送回输入流*/
scanf("%d", &array[size++]);
}
}
/*开始判断跳跃次数和跳跃点*/
jumpInterval = array[index]; /*初始的最大跳跃间隔就是第一个元素的值*/
dropPointNum[pointPos++] = array[index]; /*第一个数就是第一个跳跃点*/
size--; /*数组下标的最大值*/
while(interval != size){ /*还没跳到数组尾部*/
if(jumpInterval >= (size - index)){ /*如果跳跃间隔大于剩下的元素个数,就可以结束了*/
nodeCount++;
dropPointNum[pointPos++] = array[size]; /*跳跃点就是array最后一个元素*/
break;
}else{
max = array[index + 1];
flag = index + 1;
/*选择跳跃间隔内的最大值max*/
for(interval = index + 2; interval <= index + jumpInterval; interval++){
if(array[interval] > max){
max = array[interval];
flag = interval; /*记录跳跃点的下标*/
}
}
jumpInterval = max; /*新的最大跳跃间隔*/
nodeCount++;
index += flag;
dropPointNum[pointPos++] = max; /*记录跳跃点*/
}
}
/*打印跳跃点数和跳跃点*/
printf("%d\n", nodeCount);
pointPos = 0;
while(dropPointNum[pointPos] != 0){
if(pointPos == nodeCount)
printf("%d", dropPointNum[pointPos++]);
else
printf("%d, ", dropPointNum[pointPos++]);
}
printf("\n");
}
return 0;
}