Untitled
unknown
plain_text
2 years ago
2.0 kB
3
Indexable
#include<iostream> using namespace std; const int MAXS = 50000; int Qx[MAXS]; int Qy[MAXS]; int map[3001][3001]; int visited[3001][3001] = {0}; int dx[] = { 0, 1, 0, -1 }; int dy[] = { -1, 0, 1, 0 }; int rear, front,m,n,xT,yT,xE,yE; int cnt1, cnt2,step; void push(int x, int y){ if(rear == MAXS -1) rear = -1; rear++; Qx[rear] = x; Qy[rear] = y; } void pop(){ if(front == MAXS -1) front = -1; front++; } bool isEmpty(){ return rear == front; } int check(int i, int j){ int max =-1; for(int h =0;h<4;h++){ int x = i + dx[h]; int y = j + dy[h]; if(visited[x][y] == 0){ return 0; } if(visited[x][y] >= max){ max = visited[x][y]; } } return max; } void bfs(){ step = 1; while (!isEmpty()) { pop(); int i = Qx[front]; int j = Qy[front]; for(int h = 0;h<4;h++){ int x = i + dx[h]; int y = j + dy[h]; if(x>= 0 && x<m && y>=0 && y<n){ if(map[x][y] == 1 && visited[x][y] == 0){ visited[x][y] = visited[i][j] +1; if(visited[x][y]>step) step = visited[x][y]; push(x,y); } } } } } int main(){ //freopen("input.txt","r",stdin); int tc; cin>>tc; for(int ts =1;ts<=tc;ts++){ front = rear =-1; bool flag = 0, flag2 = 1; cout<<"Case #"<<ts<<endl; int xx,yy; cin>>m>>n>>xx>>yy; xT = xx -1; yT = yy -1; push(xT,yT); for(int i =0;i<m;i++){ for(int j=0;j<n;j++){ cin>>map[i][j]; visited[i][j] = 0; if(map[i][j] == 2){ yE = j; xE = i; if(i == 0 && j == 0 ||i == m-1 && j == 0||i == 0 && j == n-1||i == m-1 && j == n-1){ flag = 1; } } } } visited[xT][yT] = 1; bfs(); for(int i = 0;i<m;i++){ for(int j =0;j<n;j++){ if(visited[i][j] == 0 && map[i][j] != 0 && map[i][j] != 2){ flag2 = 0; } } } if(flag ||check(xE,yE) == 0){ cout<<-1<<" "<<-1<<endl; } else { if(flag2) cout<<check(xE,yE)<<" "<<step<<endl; else cout<<check(xE,yE)<<" "<<-1<<endl; } } return 0; }
Editor is loading...