本学期的的算法实践课的实验作业。写的不好请大家多多指教。
【题目】
试设计一个算法,计算出从三角形的顶到底的一条路径,使该路径经过的数字总和最大。
数据输入:
由文件input.txt提供输入数据。文件的第一行是数字三角形的行数,该数字在1到100之间。接下来n行是数字三角形各行中的数字。所有数字在0至99之间。
结果输出:
程序运行结束时,将计算结果输出到文件output.txt中。文件第一行中的数字是计算出的最大值。
输入文件实例:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int ReadFile(const char name[200], int input[20][20], int& sum)//读取txt文件内的内容
{
int a[20][20];
FILE* fp;
fp = fopen(name, "r");
if (fp == NULL)
{
printf("File cannot open!");
return 0;
}
fscanf(fp, "%d", &sum);//记录三角形的行数
for (int i = 0; i < sum; i++)
{
for (int j = 0; j <= i; j++)
{
fscanf(fp, "%d", &input[i][j]);//将数字三角形的数字存入数组
}
}
fclose(fp);
}
int WriteFile(const char name[200],int maxSum, int a[20], int& sum)//将结果写入另一个txt文件
{
FILE* fp;
fp = fopen(name, "w");
if (fp == NULL)
{
printf("File cannot write!");
return 0;
}
fprintf(fp,"最大路径和为:%d",maxSum);//将数字三角形的最大路径和写进另一个txt文件内
fprintf(fp, "\n");
fprintf(fp, "路径为:");
for (int i = 0; i < sum; i++)//写入路径
{
fprintf(fp, "%d ",a[i]);//
}
fclose(fp);
return 1;
}
int FindMax(int input[20][20],int output[20][20], int& sum)//找到最大路径和
{
for (int i = sum - 2; i >=0; i--)
{
for (int j = 0; j <=i; j++)
{
if (input[i][j] + input[i + 1][j] > input[i][j] + input[i + 1][j + 1])
{
input[i][j] = input[i][j] + input[i + 1][j];
output[i][j] = input[i][j];
}else {
input[i][j] = input[i][j] + input[i + 1][j + 1];
output[i][j] = input[i][j];
}
}
}
printf("最大路径和为:%d",input[0][0]);//在控制台输出最大路径和
printf("\n");
return input[0][0];
}
int FindRode(int a[20][20],int b[20][20],int d[20],int& sum)//路径
{
int num;
int t = 0;
printf("路径为:");
for (int s = 0; s <sum; s++)//打印路径,将路径存入一维数组
{
num = a[s][t];
d[s] =num;
printf("%d ", a[s][t]);
if (a[s][t] + b[s + 1][t] < a[s][t] + b[s + 1][t + 1])
{
t = t + 1;
}
}
printf("\n");
return 1;
}
int main(int argc, char* argv[])
{
int input[20][20];
int output[20][20];
int a[20][20];
int b[20];
int sum;
int k;
ReadFile("F:\\input.txt",input, sum);
for (int i = 0; i < sum ; i++)//将数字三角形存入数组
{
for (int j = 0; j <= i; j++)
{
a[i][j] = input[i][j];
}
}
k = FindMax(input, output, sum);
FindRode(a,output,b,sum);
WriteFile("F:\\output.txt",k,b,sum);
return 0;
}
【运行结果】