iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0

數字迷宮
數字迷宮為一個二維的數字 (0-9) 陣列。
你可以用直角方向 (東、西、南、北)在迷宮中尋訪。
假設每一格的數字代表造訪該格的成本,求出從入口走到出口所需的最小成本。


|0|3|1|2|9|

|7|3|4|9|9|

|1|7|5|5|3|

|2|3|4|2|5|

這邊可以以四個方向來思考

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);
}

上一篇
[Day15]鏈結串列 (Linked List) and 巨集(Marco)
下一篇
[Day17]以陣列實做長整數的運算
系列文
環島C一下自己的人生24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言