Untitled
unknown
plain_text
a year ago
1.6 kB
6
Indexable
#include<iostream> using namespace std; int T, n, m; int xStart, yStart, xFinish, yFinish; int map[203][203], visit[203][203], direction[203][203]; int dir[4][2] = {0, -1, -1, 0, 0, 1, 1, 0}; int front, rear; int que[1000000]; void input(){ cin >> m >> n; cin >> yStart >> xStart >> yFinish >> xFinish; for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ char c; cin >> c; if(c=='1') map[i][j]=1; else map[i][j]=0; visit[i][j]=0; direction[i][j]=0; } } direction[xStart][yStart]=-1; } bool checkBorder(int x, int y){ if(x<1 || y<1 || x>n || y>m) return false; return true; } void solve(int row, int col){ front=rear=0; que[rear++]=row; que[rear++]=col; visit[row][col]=1; while(rear>front){ int x = que[front++], y = que[front++]; for(int i=0; i<4; i++){ int xx = x + dir[i][0], yy = y + dir[i][1]; if(checkBorder(xx,yy) && map[xx][yy]==0){ int tmp = visit[x][y]; if(i!=direction[x][y]){ tmp++; } if(visit[xx][yy]==0){ visit[xx][yy] = tmp; que[rear++]=xx; que[rear++]=yy; direction[xx][yy]=i; } else if(tmp<visit[xx][yy]){ visit[xx][yy]=tmp; que[rear++]=xx; que[rear++]=yy; direction[xx][yy]=i; } } } } } int main(){ //freopen("input.txt", "r", stdin); cin >> T; for(int tc=1; tc<=T; tc++){ input(); solve(xStart, yStart); int result = -1; if(visit[xFinish][yFinish]!=0) result = visit[xFinish][yFinish]-2; cout << result << endl; } return 0; }
Editor is loading...
Leave a Comment