假设有一个4X4的方格arr[4][4],每个方格内的数字为从该方格跨到临近(上下左右)方格的权值,障碍物的权值为最大值MAX,给出起始位置arr[i1][j1],arr[i2][j2],求从arr[i1][j1]移动到arr[i2][j2]的最短加权路径?
#include <stdio.h>
#define MAX 1024
void print_arr(int (*arr)[4]){
int i,j;
for(i=0;i<4;i++){
for( j=0;j<4;j++)
{
printf("%-4d",arr[i][j]);
}//for
printf("\n");
}//for
}
int min(int a,int b,int c,int d){
a=a<b?a:b;
a=a<c?a:c;
a=a<d?a:d;
return a;
}
int fun(int i1,int j1,int i2,int j2,int (*arr)[4])
{
if(i1==i2 && j1==j2) return 0;
if(arr[i1][j1]==MAX
|| i1<0 || i1>3 || j1<0 ||j1 >3) return MAX;
int i,j,left,right,up,down;
//new arr
int my_arr[4][4]={};
for(i=0;i<4;i++){
for(j=0;j<4;j++){
my_arr[i][j]=arr[i][j];
}
}
my_arr[i1][j1]=MAX;
//find next min_step
left =fun(i1,j1-1,i2,j2,my_arr);
up
=fun(i1-1,j1,i2,j2,my_arr);
right=fun(i1,j1+1,i2,j2,my_arr);
down =fun(i1+1,j1,i2,j2,my_arr);
int min_step= min(left,right,up,down);
min_step += arr[i1][j1];
//return min_step
return min_step;
}
void main(){
int i=0,j=0;
//init array arr[4][4];
int arr[4][4]={{2,5,2,1},{1,2,1,2},{MAX,MAX,MAX,MAX},{1,0,4,1}};
//usage
int min_step=fun(1,0,0,3,arr);
printf("min_step =%d\n",min_step);
}