数据结构课设(二)滑雪场问题 C语言代码
一、问题描述
Michael 喜欢滑雪这并不奇怪,因为滑雪的确很好玩,可是为了获得速度,滑的区域必须向下倾斜,而且当滑到坡底,你不得不再次走上坡或者等待升降机来载你上坡。Michael想知道在一个区域中最长的滑坡。该区域由一个二维数组给出。数组的每个数字代表点的高度。滑雪者可从某个点滑向其上下左右相邻4个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-…-1更长。事实上,这是最长的一条。
二、使用步骤
经过分析,本题需要完成的需求是:
①解决滑雪场问题
②以上面滑雪场示例为测试数据,求出滑雪场最长滑道的长度
③输出最长滑道线路。
④输入形式:无
⑤输出形式:线路及长度以整数形式输出。
1.C代码
代码如下(示例):
#include<stdio.h>
int a[1024];//保存结果
int b = 0;
void calculate(int *Small_volume, int now, int total, int number, int The_total_volume) {
for (int i = now; i < number; i++)
{
a[b] = Small_volume[i];//a保存当前的数
total += a[b];//total取和
b++;
if (total < The_total_volume)
{//比背包小的时候进入递归
calculate(Small_volume, i + 1, total, number, The_total_volume);
total -= a[--b];//递归结束减去当前数,准备进入下一次循环
}
else
{
if (total > The_total_volume)//比背包大
{
total -= a[--b];
}
else //相等
{
for (int j = 0; j < b; j++)
{
printf("%d ", a[j]);
}
printf("\n");
total -= a[--b];
}
}
}
}
int main()
{
int The_total_volume;
printf("输入背包最大体积:");
scanf("%d",&The_total_volume);
printf("\n");
int number;
printf("输入物品数量:");
scanf("%d",&number);
printf("\n");
int Small_volume[1024];
printf("输入各个物品体积:");
for(int i;i<number;i++)
{
scanf("%d",&Small_volume[i]);
}
int total = 0, locate = 0;
calculate(Small_volume, locate, total, number,The_total_volume);
}
总结
深度搜索直至找出最长路径为止,递归的动态规划求解,
用一个二维数组保存输入的原本数据,
再用一个二维数组保存对应位置的最大滑行距离;
如果它比某一方向上的高度高,则它的滑行距离就应该是相比较的最大滑行距离+1和它保存的最大滑行距离中的最大值
最后求完总共的点,进行遍历,得到最终最大值即可。