Quick actions

cmd+k|ctrl+k

Navigation

Languages

4485

Snippet info

Language

C

Visibility

public

Author

vghjm

Created

2019-08-06T02:52:41Z

Updated

2019-08-06T02:52:41Z

#include <stdio.h>
#include <limits.h>
#define min(a, b) (((a)>(b)) ? (b):(a))

int cave[126][126];
int al[126][126];
int visit[126][126];

int main(void) {
    int N;
    int t=1;
    int first=1;
    
    while(1){
        scanf("%d", &N);
        if(N==0)
            break;
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                scanf("%d", &cave[i][j]);
                //initial al
                al[i][j] = INT_MAX;
                visit[i][j] = 0;
            }
        }
        
        //calc
        al[0][0] = cave[0][0];
        al[0][1] = al[0][0] + cave[0][1];
        al[1][0] = al[0][0] + cave[1][0];
        visit[0][0] = 1;
        
        while(1){
            int x=-1;
            int y=-1;
            int minimal=INT_MAX;
        
            for(int i=0; i<N; i++){
                for(int j=0; j<N; j++){
                    if(visit[i][j]==0 && al[i][j]<minimal){
                        x=i;
                        y=j;
                        minimal = al[i][j];
                    }
                }
            }
            if(x==-1 || y==-1) break;
            visit[x][y] = 1;
            if(y-1>=0){
                al[x][y-1] = min(al[x][y]+cave[x][y-1], al[x][y-1]);
                if(al[x][y]+cave[x][y-1] < al[x][y-1] && visit[x][y-1]==1)
                    visit[x][y-1] = 0;
            }
            if(y+1<N){
                al[x][y+1] = min(al[x][y]+cave[x][y+1], al[x][y+1]);
                if(al[x][y]+cave[x][y+1] < al[x][y+1] && visit[x][y+1]==1)
                    visit[x][y+1] = 0;
            }
            if(x-1>=0){
                al[x-1][y] = min(al[x][y]+cave[x-1][y], al[x-1][y]);
                if(al[x][y]+cave[x-1][y] < al[x-1][y] && visit[x-1][y]==1)
                    visit[x-1][y] = 0;
            }
            if(x+1<N){
                al[x+1][y] = min(al[x][y]+cave[x+1][y], al[x+1][y]);
                if(al[x][y]+cave[x+1][y] < al[x+1][y] && visit[x+1][y]==1)
                    visit[x+1][y] = 0;
            }
        }
        
        if(!first){
            printf("\n");
        }
        first=0;
        printf("Problem %d: %d", t, al[N-1][N-1]);
        t++;
        
    }//E: while
        
    
    return 0;
}
INFO