我必须编写一个程序,在整数的三角形迷宫中找到最大值的路径。
我的fscanf
功能有问题。由于某种原因,它不会读取。我非常感谢任何帮助或建议,因为这个项目应该尽快到期。
这是一个迷宫的例子:
30
47 1
35 65 21
0 74 94 58
71 29 34 28 60
97 6 29 19 26 68
37 1 48 98 57 89 64
60 38 33 23 49 57 19 50
4 83 52 47 84 60 16 56 90
19 59 6 10 97 47 96 93 59 50
这是我到目前为止所得到的:
/#include <stdio.h>
/#include <stdlib.h>
/#define MAX 100
void read (int maze [][MAX]);
int findPath (int maze[][MAX], int map[][MAX], int size);
void print (int map [][MAX]);
int main()
{
int maze [][MAX] = {};
int map [][MAX] = {};
int sum = 0;
int size = MAX;
read (maze);
findPath (maze, map,size);
print (map);
return;
}
void read (int maze[][MAX])
{
FILE * mazeFile;
int num, r, c, count;
if ((mazeFile = fopen ("t4.txt", "r")) == NULL)
{
printf ("Error opening a file\n");
}
else
{
while (mazeFile != EOF)
{
fscanf (mazeFile, "%d", &maze[r][c]);
for (r = 0; r < 100 ; r++)
{
count = r + 1;
for (c = 0; c <= count; c++)
{
printf ("(%d, %d) = %d\n",r, c, maze[r][c]);
}
}
fclose (mazeFile);
return;
}
}
}
int findPath (int maze[][MAX], int map[][MAX], int size)
{
int sum [MAX][MAX] = {0};
int row, col, maxNum;
for(row=(size-1); row >= 1; --row)
{
for (col-row;col>=1;--col)
{
maxNum = (sum[row+1][col] > sum [row+1][col+1] ? col : col + 1);
sum[row][col]= maze[row][col] + sum [row+1][maxNum];
map[row][col] = maxNum;
}
}
return sum [0][0];
}
void print (int map [][MAX])
{
printf ("(%d, %d) = ", map[0][0], map[0][1]);
return;
}
答案 0 :(得分:3)
嗯:-)有很多问题,但你问的问题是阅读文件,所以我现在就解决这个问题:
read
,write
,因为它们是标准库函数,会遇到很多问题; 以下是如何正确编码文件的代码示例。
创建一个简单的函数,只读取内容并将其转储回来,以便您知道您的READING正常。
#include <stdio.h>
/**
* @function: read_maze
* @desc: Reads a maze file and dumps it to stdout,
* @return: Returns 0 on success, -1 on failure
*
*/
int read_maze(const char *filename)
{
FILE *fp;
int entry;
fp = fopen(filename, "r");
if ( !fp ) {
perror(filename); /* prints system error related to
* the problem reading mazefile
*/
return -1;
}
while(!feof(fp)) {
if (fscanf(fp, "%d", &entry) == 1) {
printf ("%d\n", entry);
}
}
return 0;
}
int main()
{
if(read_maze("t4.txt")) {
return -1;
}
return 0;
}
创建一个有意义的三角形迷宫阵列:
好的,现在我们知道我们可以正确读取文件,让我们尝试将其放入一个有意义的结构中。
我们知道我们有一堆行(100),第一行有1列,第二行有2,第3行有3 ......等等...
换句话说,每一行的基数与其基数(索引+ 1)相同;
以下是什么?
int row0[1];
int row1[2];
int row2[3];
.
.
.
int row99[100];
这有点难看,而不是真正的程序化;自动这样做会很好; 我们知道固定数是行数,动态分配与索引相关联。所以让我们创建一个指向整数的指针数组;然后,这个数组的每个成员都可以是一个动态分配的内存块,就像成员的基数一样大。 (嘴里嘿嘿)
#define MAXROWS 100
int *row[MAXROWS];
注意:从概念上讲,MAXROWS实际上对应于我们在单词row
前面的硬编码0-99而不是括号中的数组大小的声明片段。所以int row55[56];
这就是宣告55; 56声明将来自malloc;
现在我们知道指向数据类型的指针就是这样一个指向POINT到内存的指针阻塞我们的数据(基本上充当数组)换句话说让我们为每一行分配适当的列:
/* starting from beginning */
#define MAXROWS 100
int *rows[MAXROWS];
int init_triangular_array()
{
int k;
memset(rows, 0, sizeof(int *)*MAXROWS); /* make the rows array all zeros */
for (k = 0; k < MAXROWS; k++) {
rows[k] = (int *)calloc(k+1, sizeof(int)); /* cardinality */
if( rows[k] == NULL ) {
fprintf(stderr, "Unable to allocate memory, quoting\n");
exit(-1); /* just kill the program */
}
}
}
现在我们有了一个初始化数组的函数......让我们创建一个函数来完成数组的释放;因为那只是很好的编码实践。
void free_triangular_array()
{
int k;
for (k = 0; k < MAXROWS; k++ ) {
if ( rows[k] )
free(rows[k]);
}
}
现在让我们编写一个函数来填充我们的文件:
int fill_triangular_array(const char *filename)
{
FILE *fp = fopen(...);
int row = 0, col = 0;
while(!feof(fp)) {
for (col = 0; col <= row_number; col++ ) {
// read an entry as above
rows[row][col] = entry;
}
}
}
你可以填补缺失的部分。
现在你已经完成了所有这一切
int main()
{
init_triangular_array();
fill_triangular_array();
/* do something with the array */
free_triangular_array();
}