- /******************************************************************
- funciton:给定一个数字矩阵求从左上角到右下角距离最大。输出最大距离值。
- condition:路径只能是往右与往下走。
- Example
- Input:
- 2 2
- 0 6
- 3 4
- 3 2
- 8 1 9
- 2 2 9
- Output:
- 10
- 27
- Method
- 给定一个距离矩阵用来存放从左上角到该位置的最大距离值。
- 每输入一个值就计算该点的最大距离值。可以知道,该点的最大
- 距离值就是他的上方和左方两者之间最大的距离值。
- ******************************************************************/
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- #include <malloc.h>
- int main(void)
- {
- int n;
- int m;
- int i;
- int j;
- int *a;// 数字矩阵
- int *d;// 距离矩阵
- srand((unsigned int)time(NULL));// 随机种子
- while(scanf("%d%d", &n, &m))
- {
- if (m<=n&&n)
- {
- a = (int*)malloc(sizeof(int)*n*m);
- d = (int*)malloc(sizeof(int)*n*m);
- for (i=0; i<m; i++)
- {
- for (j=0; j<n; j++)
- {
- a[i*n+j] = rand()%10;
- if (i==0 && j==0)
- d[i+j] = a[i+j];// 距离矩阵左上角第一个元素
- else if (i==0 &&j!=0)
- {
- d[i*n+j] = d[i*n+j-1]+a[i*n+j];// 第一行的数字
- }
- else if (i!=0&&j==0)
- {
- d[i*n+j] = d[(i-1)*n+j] + a[i*n+j];// 第一列的数字
- }
- else
- {
- d[i*n+j]= d[(i-1)*n+j] > d[i*n+j-1] ? d[(i-1)*n+j]: d[i*n+j-1];
- d[i*n+j] += a[i*n+j];// 中间的数字都取上方和左方两者最大的
- }
- printf("%3d", a[i*n+j]);
- }// end for
- printf("/n");
- }//end for
- }// end if
- else
- return 0;
- printf("%d", d[n*m-1]);
- free(a);
- free(d);
- }// end while
- return 0;
- }