Rock Climbing

 avatar
user_1164828
c_cpp
a year ago
4.1 kB
7
Indexable
#include<iostream>
using namespace std;

int N, M;
int map[55][55];
int xS,yS, xE,yE;
int visited[55][55];
int queue[100000][2];
int l,r;
int dx[] ={-1,0,1,0};
int dy[] ={0,1,0,-1};
//So buoc nhay toi thieu
int h;

bool check(int x, int y){
    return (x>=0 && x<N && y>=0 && y<M);
}

bool BFS(int row, int col){
    //Reset visited[][]
    for(int i=0;i<=N;i++){
        for(int j=0;j<=M;j++){
            visited[i][j]=0;
        }
    }
    //Reset Queue
    l=r=0;
    //Them vao Queue
    queue[r][0] = row;
    queue[r++][1] = col;
    //Danh dau la da tham
    visited[row][col]=1;
    //Duyet cho den khi queue rong
    while(l!=r){
        int x = queue[l][0];
        int y = queue[l++][1];
        //Neu den dich roi -> tra v true
        if(map[x][y]==3)
            return true;
        //loang 1 huong
        if(xE==N-1){
            //cout << "hhehe";
            for(int i=0;i<M;i++){
                int ny = y + i;
                if(map[xE][ny]==0)
                    break;
                if(check(xE,ny) && visited[xE][ny]==0 && map[xE][ny]!=0){
                    if(map[xE][ny]==3){
                        //h=0;
                        return true;
                    }
                }
            }
        }
        //loang 4 huong
        for(int i=0;i<4;i++){
            if(i%2==0){
                for(int j=0;j<=h;j++){
                    int nx = x + j*dx[i];
                    int ny = y + dy[i];
                    //Check bien && da tham chua && co duong di khong 
                    if(check(nx,ny) && visited[nx][ny]==0 && map[nx][ny]!=0){
                        //Danh dau la da tham
                        visited[nx][ny] =1;
                        //push vao queue
                        queue[r][0] = nx;
                        queue[r++][1] =ny;
                        //Neu gap dich -> return
                        if(map[nx][ny]==3)
                            return true;
                        //Nho break vong for h ra 
                        break;
                    }
                }
            }
            else{
                int nx = x + dx[i];
                int ny = y + dy[i];
                //Check bien && da tham chua && co duong di khong 
                if(check(nx,ny) && visited[nx][ny]==0 && map[nx][ny]!=0){
                    //Danh dau la da tham
                    visited[nx][ny] =1;
                    //push vao queue
                    queue[r][0] = nx;
                    queue[r++][1] =ny;
                    //Neu gap dich -> return
                    if(map[nx][ny]==3)
                        return true;
                }
            }
        }
    }
    return false;
}

int main(){
    // freopen("Text.txt","r",stdin);
    //  int T;
    //  cin >> T;
    //  for(int t=1; t <= T; t++){
    cin >> N >> M;
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            cin >> map[i][j];
            if(map[i][j]==3){
                xE = i;
                yE = j;
            }
        }    
    }
    for(h=0;h<M;h++){
        if(BFS(N,0))
            break;
    }
    // cout << "Case #" << t << endl;
    cout << h << endl;
     // }
    return 0;
}

//testcase//
5 8
1 1 1 1 0 0 0 0
0 0 0 3 0 1 1 1
1 1 1 0 0 1 0 0
0 0 0 0 0 0 1 0
1 1 1 1 1 1 1 1
5 5
1 1 1 1 3
0 0 1 1 0
1 1 1 0 0
0 0 0 0 0
1 0 0 0 0
5 5
1 1 1 1 1
0 0 0 0 3
0 0 0 0 0                    
0 0 0 0 0
1 1 1 1 1
5 5
1 1 1 1 3
1 1 1 1 0
0 0 0 0 0
1 1 1 0 0
1 0 0 0 0
8 8 
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 3
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 1
4 4
0 0 0 3
0 1 1 1
0 0 0 0
1 1 0 0
2 2
1 3
1 0
2 2
1 3
1 0
3 3
1 0 0 
1 1 1
1 1 3
5 5
1 1 1 1 1
1 1 1 1 1
3 1 1 1 1
0 0 0 0 1
1 1 1 1 1
2 2
1 1
3 1
5 5
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 3
//
case 1: 2
case 2: 2
case 3: 3
case 4: 2
case 5: 5
case 6: 2
case 7: 1
case 8: 1
case 9: 0
case 10: 1
case 11: 0
case 12: 4
Editor is loading...
Leave a Comment