题目描述
田野上搭建了一个黄金大神专用的栅栏围成的迷宫。幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽W(1<=W<=38)及长H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数(就是从最“糟糕”的一点,走出迷宫的最少步数)。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,黄金大神让你必须只会水平或垂直地在X或Y轴上移动,你不能从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫:
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。
PROGRAM NAME: maze
INPUT FORMAT:
(file maze.in)
第一行: W和H(用空格隔开)
第二行至第2*H+1行: 每行2*W+1个字符表示迷宫
OUTPUT FORMAT:
(file maze.out)
输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。
SAMPLE INPUT
5 3
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
SAMPLE OUTPUT
9
善良的学长:样例输入可以复制进记事本或者文本文档这样看起来更加直观!!!=v=
题解
bfs。
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<cmath> #include<algorithm> using namespace std; char ch[250][150]; int n,m,ans=1; struct dui {int x,y;} q[200002]; int t,w,bs[250][150],mark[250][150]; int xx[4]={0,0,-2,2},yy[4]={2,-2,0,0}; void init() { scanf("%d%d\n",&m,&n); memset(bs,127/3,sizeof(bs)); int i,j; for(i=0;i<=2*n;i++) {gets(ch[i]); //puts(ch[i]); if(i==0) {for(j=1;j<2*m;j++) {if(ch[0][j]==' ') {w++; q[w].x=1; q[w].y=j; bs[1][j]=1; //printf("1 %d\n",j); mark[1][j]=1; } } } if(i==2*n) {for(j=1;j<2*m;j++) {if(ch[i][j]==' ') {w++; q[w].x=i-1; q[w].y=j; bs[i-1][j]=1; //printf("%d %d\n",i-1,j); mark[i-1][j]=1; } } } if(i%2==1&&ch[i][0]==' ') {w++; q[w].x=i; q[w].y=1; bs[i][1]=1;//printf("%d %d\n",i,1); mark[i][1]=1; } if(i%2==1&&ch[i][2*m]==' ') {w++; q[w].x=i; q[w].y=2*m-1; bs[i][2*m-1]=1; //printf("%d %d\n",i,2*m); mark[i][2*m-1]=1; } } } bool check(int x,int y,int s) { if(x<1||y<1||x>=2*n||y>=2*m) return false; //if(mark[x][y]) return false; if(s==0&&ch[x][y-1]=='|') return false; if(s==1&&ch[x][y+1]=='|') return false; if(s==2&&ch[x+1][y]=='-') return false; if(s==3&&ch[x-1][y]=='-') return false; return true; } void bfs() { t=1; int i,p,nx,ny,tx,ty; while(t<=w) {nx=q[t].x; ny=q[t].y; //mark[nx][ny]=1; t++; for(i=0;i<4;i++) {tx=nx+xx[i]; ty=ny+yy[i]; if(check(tx,ty,i)) {if(bs[tx][ty]>bs[nx][ny]+1) {bs[tx][ty]=bs[nx][ny]+1; ans=max(ans,bs[tx][ty]); if(!mark[tx][ty]) {w++; q[w].x=tx; q[w].y=ty; mark[tx][ty]=1;} } } } } printf("%d\n",ans); } int main() { freopen("maze.in","r",stdin); freopen("maze.out","w",stdout); init(); bfs(); //system("pause"); return 0; }