#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<ctime> #include<cstdlib> using namespace std; int n; int a[5100][5100]; int dir[4][2]={0,1,0,-1,1,0,-1,0}; int vis[5100][5100]; struct node {     int x,y,dis;     node(){}     node(int xx,int yy,int ddis):x(xx),y(yy),dis(ddis){} }; vector<node> ve; int bfs() {     queue<node> q0,q1;     ve.clear();     q0.push(node(0,0,0));     vis[0][0]=1;     while(1)     {         bool judge=false;         while(!q0.empty())         {             judge=true;             node z=q0.front();q0.pop();             if(z.x==n-1&&z.y==n-1) return z.dis;             for(int i=0;i<4;i++)             {                 int nx=z.x+dir[i][0];                 int ny=z.y+dir[i][1];                 if(nx<0||nx>=n||ny<0||ny>=n) continue;                 if(vis[nx][ny]) continue;                 if(a[nx][ny]==0) q0.push(node(nx,ny,z.dis));                 else q1.push(node(nx,ny,z.dis+1));                 vis[nx][ny]=1;             }         }         if(!judge)         {             int sz=(int)ve.size();             for(int i=0;i<sz;i++)             {                 q1.push(ve[i]);                 vis[ve[i].x][ve[i].y]=1;             }             ve.clear();         }         while(!q1.empty())         {             node z=q1.front();q1.pop();             if(z.x==n-1&&z.y==n-1) return z.dis;             for(int i=0;i<4;i++)             {                 int nx=z.x+dir[i][0];                 int ny=z.y+dir[i][1];                 if(nx<0||nx>=n||ny<0||ny>=n) continue;                 if(vis[nx][ny]) continue;                 if(a[nx][ny]==0)                 {                     q0.push(node(nx,ny,z.dis));                     vis[nx][ny]=1;                 }                 else ve.push_back(node(nx,ny,z.dis+1));             }         }     } } int main() {     while(scanf("%d",&n)!=EOF)     {         for(int i=0;i<n;i++)             for(int j=0;j<n;j++)                 scanf("%d",&a[i][j]);         memset(vis,0,sizeof(vis));         printf("%d\n",bfs());     }     return 0; } 第三题
点赞 评论

相关推荐

frutiger:逆天,我家就安阳的,这hr咋能说3k的,你送外卖不比这工资高得多?还说大厂来的6k,打发叫花子的呢?这hr是怎么做到说昧良心的话的
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务