數字迷宮
數字迷宮為一個二維的數字 (0-9) 陣列。
你可以用直角方向 (東、西、南、北)在迷宮中尋訪。
假設每一格的數字代表造訪該格的成本,求出從入口走到出口所需的最小成本。
這邊可以以四個方向來思考
1.往四個方向走
2.判斷可否走
3.判斷是否走過
4.是否為路口
tips:往四個方向走(走過改寫為-1)
將目前座標放入stack(當路口)
當死路時POP座標
(x-1,y)
^
|
(x,y-1)<-----|----->(x,y+1)
|
|
v
(x+1,y)
給你一 N×M (1 <= N、M <= 9) 的數字迷宮,
你必須求出從左上角走到右下角所需的最小成本。
上面範例的解答為 24。
input:
4
5
0 3 1 2 9
7 3 4 9 9
1 7 5 5 3
2 3 4 2 5
output:
24
#include <stdio.h>
int f(int a[][9],int b[][9],int M,int N,int x,int y,int path,int *min){
path+=a[x][y];
b[x][y]=0;
if(x==M-1&&y==N-1){
if(*min>path){
*min=path;
}
}
else{
int nxt_x,nxt_y;
nxt_x=x-1;
nxt_y=y;
if(nxt_x>=0){
if(b[nxt_x][nxt_y]==1){
f(a,b,M,N,nxt_x,nxt_y,path,min);
}
}
nxt_x=x;
nxt_y=y+1;
if(nxt_y<N){
if(b[nxt_x][nxt_y]==1){
f(a,b,M,N,nxt_x,nxt_y,path,min);
}
}
nxt_x=x+1;
nxt_y=y;
if(nxt_x<M){
if(b[nxt_x][nxt_y]==1){
f(a,b,M,N,nxt_x,nxt_y,path,min);
}
}
nxt_x=x;
nxt_y=y-1;
if(nxt_y>=0){
if(b[nxt_x][nxt_y]==1){
f(a,b,M,N,nxt_x,nxt_y,path,min);
}
}
}
b[x][y]=1;
}
int main(){
int M,N,min=99999;
int a[9][9],b[9][9];
int i,j;
scanf("%d%d",&M,&N);
for(i=0;i<M;i++){
for(j=0;j<N;j++){
scanf("%d",&a[i][j]);
b[i][j]=1;
}
}
f(a,b,M,N,0,0,0,&min);
printf("%d",min);
}