Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<queue>
- using namespace std;
- struct vertices{
- int I,J,dis;
- bool operator < (const vertices& rhs)const{
- return dis > rhs.dis;
- }
- };
- bool isinbound(int I,int N){
- return (I >= 1 && I <= N);
- }
- int main()
- {
- int n;
- // printf("Test\n");
- scanf("%d",&n);
- bool map[n+2][n+2];for(int i=0;i<n+2;i++)for(int j=0;j<n+2;j++)map[i][j] = true;
- bool visited[n+2][n+2];for(int i=0;i<n+2;i++)for(int j=0;j<n+2;j++)visited[i][j] = false;
- int dist[n+2][n+2];for(int i=0;i<n+2;i++)for(int j=0;j<n+2;j++)dist[i][j] = 2e9;
- dist[1][1] = 0;
- for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&map[i][j]);
- priority_queue<vertices> pq;
- pq.push({1,1,0});
- int moveI[4] = {-1,0,1,0};
- int moveJ[4] = {0,1,0,-1};
- while(!pq.empty()){
- int uI = pq.top().I;
- int uJ = pq.top().J;
- int uD = pq.top().dis;
- // printf("Test (%d,%d) : %d\n",uI,uJ,uD);
- pq.pop();
- if(visited[uI][uJ])continue;
- visited[uI][uJ] = true;
- for(int i=0;i<4;i++){
- int cnt = 0;
- int nI = uI;
- int nJ = uJ;
- while(!map[nI + moveI[i]][nJ + moveJ[i]] && isinbound(nI + moveI[i],n) && isinbound(nJ + moveJ[i],n) ){
- nI += moveI[i];
- nJ += moveJ[i];
- cnt++;
- }
- if(!visited[nI][nJ] && !(nI == uI && nJ == uJ) && dist[uI][uJ] + cnt < dist[nI][nJ] && nI >= 1 && nI <= n && nJ >= 1 && nJ <= n){
- dist[nI][nJ] = dist[uI][uJ] + cnt;
- pq.push({nI,nJ,dist[nI][nJ]});
- }
- }
- }
- printf("%d",dist[n][n]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment