题意是给一个二维的迷宫,求任意一个点以最优方案走到出口的步数。求这些点中里出口最远的一个点的步数。
迷宫有两个出口。
做法是从两个出口各做一遍宽度优先搜索,然后就得到了所有点离当前门口最近的距离。在step数组中记录下最短距离,然后两边宽搜取最小值。
然后遍历step数组,输出最大的一个就是答案。
/* ID: modengd1 PROG: maze1 LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <queue> using namespace std; char input[210][90]; int step[210][90]; bool vis[210][90]; int W,H; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; struct node { int x,y; int T; node(int xx,int yy,int tt) { x=xx;y=yy;T=tt; } node(){} }; void BFS(int xx,int yy) { memset(vis,false,sizeof(vis)); queue<node> Q; node now=node(xx,yy,1); step[xx][yy]=1; vis[xx][yy]=true; Q.push(now); while(!Q.empty()) { now=Q.front(); Q.pop(); node next; for(int i=0;i<4;i++) { next=node(now.x+dx[i]+dx[i],now.y+dy[i]+dy[i],now.T+1); if(next.x>=2*H+1||next.x<0||next.y>=2*W+1||next.y<0) continue; if(input[next.x-dx[i]][next.y-dy[i]]!=‘ ‘) continue; if(vis[next.x][next.y]) continue; vis[next.x][next.y]=true; if(step[next.x][next.y]>next.T) step[next.x][next.y]=next.T; Q.push(next); } } } int main() { freopen("maze1.in","r",stdin); freopen("maze1.out","w",stdout); memset(step,0x7f,sizeof(step)); int x1,y1,x2,y2; scanf("%d%d",&W,&H); getchar(); for(int i=0;i<2*H+1;i++) { for(int j=0;j<2*W+1;j++) { scanf("%c",&input[i][j]); } getchar(); } for(int i=0;i<2*W+1;i++) { if(input[0][i]==‘ ‘) BFS(1,i); if(input[2*H][i]==‘ ‘) BFS(2*H-1,i); } for(int j=0;j<2*H+1;j++) { if(input[j][0]==‘ ‘) BFS(j,1); if(input[j][2*W]==‘ ‘) BFS(j,2*W-1); } int ans=0; for(int i=1;i<2*H;i+=2) { for(int j=1;j<2*W;j+=2) ans=max(ans,step[i][j]); } cout<<ans<<endl; return 0; }
时间: 2024-10-07 05:10:53