| 飘飘乎居士——violet hill #include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<string> using namespace std; struct node { int x,y; int l; int flag;//表示时候已经穿过墙壁 }; int n,m; int vis[1100][1100][2]; string map[1100]; queue<node> q; int xx[4]={0,0,1,-1}; int yy[4]={-1,1,0,0}; int bfs() { memset(vis,0,sizeof(vis)); while(!q.empty()) q.pop(); node pre; pre.x=0,pre.y=0,pre.l=0,pre.flag=0; vis[0][0][0]=1; q.push(pre); while(!q.empty()) { node res=q.front();q.pop(); if(res.x==n-1&&res.y==m-1) return res.l; for(int i=0;i<4;i++) { int x=res.x+xx[i],y=res.y+yy[i]; if(x<0||x>=n||y<0||y>=m) continue; if(x==n-1&&y==m-1) return res.l+1; if(map[x][y]=='.') { if(vis[x][y][res.flag]) continue; node las; las.x=x,las.y=y,las.l=res.l+1,las.flag=res.flag; vis[x][y][las.flag]=1; q.push(las); } else { if(res.flag) continue; node las; las.x=x,las.y=y,las.l=res.l+1,las.flag=1; vis[x][y][las.flag]=1; q.push(las); } } } return -1; } int main() { // freopen("oo.txt","w",stdout); while(scanf("%d%d",&n,&m)==2) { for(int i=0;i<n;i++) cin>>map[i]; int cnt=bfs(); if(cnt==-1) printf("no/n"); else printf("%d/n",cnt); } return 0; } |