滑雪的最长路径,一个人可以从某个点往上下左右移动,当然只能从高往低滑动,求最长的一条滑动路径
(我为了方便,二维数组直接random,就不手动输入了)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define up 0
#define down 1
#define left 2
#define right 3
#define self 5
int changed=1;
void findNext(int row,int column,int a[row][column],int i,int j,int dir[row][column],int gao[row][column])
{
//int gaodu,next;
if( (i>0) && (a[i][j]>a[i-1][j]) && (gao[i][j]<=gao[i-1][j]))
{
gao[i][j] = gao[i-1][j]+1;
dir[i][j]=up;
changed=1;
}
if( (i<row-1) && (a[i][j]>a[i+1][j]) && (gao[i][j]<=gao[i+1][j]) )
{
gao[i][j] = gao[i+1][j]+1;
dir[i][j]=down;
changed=1;
}
if( (j>0) && (a[i][j]>a[i][j-1]) && (gao[i][j]<=gao[i][j-1]) )
{
gao[i][j] = gao[i][j-1]+1;
dir[i][j]=left;
changed=1;
}
if( (j<column-1) && (a[i][j]>a[i][j+1]) && (gao[i][j]<=gao[i][j+1]) )
{
gao[i][j] = gao[i][j+1]+1;
dir[i][j]=right;
changed=1;
}
}
void lujing(int row,int column,int a[row][column],int i,int j,int dir[row][column])
{
while(dir[i][j]!=self)
{
printf("%d -> ",a[i][j]);
if(dir[i][j] == up){
i--;
}
else if(dir[i][j] == down){
i++;
}
else if(dir[i][j] == left){
j--;
}
else if(dir[i][j] == right){
j++;
}
}
printf("%d \n",a[i][j]);
}
int main()
{
srand((unsigned)time(NULL));
int row,column;
scanf("%d %d",&row,&column);
int a[row][column],i,j;
int dir[row][column],gao[row][column];
for(i=0;i<row;i++)
for(j=0;j<row;j++)
a[i][j]=rand()%100;
for(i=0;i<row;i++)
for(j=0;j<row;j++){
dir[i][j]=self;
gao[i][j]=1;
}
//下面是显示随机产生的矩阵
printf("随机产生的二维数组(各坐标海拔)\n");
for(i=0;i<row;i++){
for(j=0;j<column;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
while(changed)
{
changed=0;
for(i=0;i<row;i++)
for(j=0;j<column;j++){
findNext(row,column,a,i,j,dir,gao);
}
}
//显示每个点的最长路径
printf("\n各坐标往下走最多走的步数\n");
for(i=0;i<row;i++){
for(j=0;j<column;j++)
printf("%d\t",gao[i][j]);
printf("\n");
}
//找出最长路径的点
int maxi=0,maxj=0;
for(i=0;i<row;i++)
for(j=0;j<column;j++){
if(gao[i][j]>gao[maxi][maxj])
{
maxi=i;maxj=j;
}
}
//打印最长路径
printf("\n最长路径为\n");
lujing(row,column,a,maxi,maxj,dir);
//写到这里我只能用牛逼来形容
return 0;
}
运行结果如下