万圣节即将到来,是时候进行捣蛋了。您位于n-by-n城镇地图的左上角,前往位于右下角的万圣节派对。在您的旅行中,您决定访问最少数量的房屋以获得零食。您有一张城镇地图,其中包含每个地点可用的零食量(≥0)的信息。例如,n = 3的城镇地图如下所示。
6 8 2
4 5 1
3 9 10
要获得最大值,您将从家(6)开始,然后向东行至(8),然后向南行至(5),然后向南行至(9),然后向东行至(10)并最终到达派对。
所以零食的数量是6 + 8 + 5 + 9 + 10 = 38。
请注意,要访问最少数量的房屋,您需要从一个房屋向东或向南行驶,直到您到达该房间。要获得最大值,请在访问每个家庭时跟踪当前最大值。
6,14,2 + 14 = 16
10,5 + max(10,14)= 19
3 + 10 = 13
所以程序需要选择最大值来添加让我们说10和14,我会选择添加14.但是我使用for循环时遇到了麻烦。有人可以帮忙吗?
1 #include <stdio.h>
2
3 #define SIZE 10
4
5 int pathmax(int map[][SIZE], int n);
6 void read(int map[][SIZE], int n);
7 int max(int x, int y);
8
9 int main(void)
10 {
11 int map[SIZE][SIZE], n;
12
13 printf("Enter n: ");
14 scanf("%d", &n);
15
16 read(map,n);
17
18 printf("Maximum: %d\n", pathmax(map,n));
19
20 return 0;
21 }
22
23 int max(int x, int y)
24 {
25 if (x > y)
26 return x;
27 else
28 return y;
29 }
30
31 int pathmax(int map[][SIZE], int n)
32 {
33 int k, i, j;
34
35 for (k = 1; k < 2*n-1; k++)
36 for (i = 0; i < n; i++)
37 for (j = 0; j < n; j++)
if(i+j==k)
{
if (i==0)
map[i][j] += map[i][j-1];
else if (j == 0)
map[i][j] += map[i-1][j];
else
map[i][j] += max(map[i-1][j], map[i][j-1];
}
}
答案 0 :(得分:0)
递归解决方案,老师会相信你写的吗?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXTREAT 10
#define GRID 3
int map [GRID][GRID];
int maxtreats;
void explore(int x, int y, int treats)
{
treats += map [y][x];
if (x == GRID-1 && y == GRID-1) { // reached bottom right?
if (treats > maxtreats) // check result
maxtreats = treats; // finish recursion
} else { // recurse
if (x+1 < GRID)
explore (x+1, y, treats); // go east
if (y+1 < GRID)
explore (x, y+1, treats); // go south
}
}
int main()
{
int x, y;
srand ((unsigned int)time(NULL)); // seed random num gen
for (x=0; x<GRID; x++) { // set up random map
for (y=0; y<GRID; y++) {
map[y][x] = 1 + rand() % MAXTREAT;
printf ("%4d", map[y][x]);
}
printf ("\n");
}
explore (0, 0, 0);
printf ("Max treats %d\n", maxtreats);
return 0;
}