1、栅栏迷宫
田野上搭建了一个黄金大神专用的栅栏围成的迷宫。幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽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=
广搜签到题……难度为负……就是读入的处理讨厌了点
考场上预处理没搞好才90……一定是因为昨晚打cf太迟今天没睡醒
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define N 100000 const int mx[5]={0,-1,0,1,0}; const int my[5]={0,0,1,0,-1}; int n,m,t,w,ma; char ch; int mrk[210][210]; bool link[210][210][5]; int dist[210][210]; int qx[N],qy[N]; inline void bfs() { while (t<w) { int nx=qx[++t],ny=qy[t]; for (int k=1;k<=4;k++) if (link[nx][ny][k]) { int wx=mx[k]+nx; int wy=my[k]+ny; if (wx<1||wx>n||wy<1||wy>m||dist[wx][wy]!=-1)continue; dist[wx][wy]=dist[nx][ny]+1; ma=max(ma,dist[wx][wy]); qx[++w]=wx; qy[w]=wy; } } } int main() { freopen("maze.in","r",stdin); freopen("maze.out","w",stdout); memset(dist,-1,sizeof(dist)); scanf("%d%d",&m,&n); for (int i=1;i<=2*n+1;i++) { for(int j=1;j<=2*m+1;j++) { char ch=getchar(); while (ch!=' '&&ch!='+'&&ch!='-'&&ch!='|')ch=getchar(); if(i%2!=0&&j%2==0) { if (ch!=' ')continue; int x=(i-1)/2; int y=j/2; link[x][y][3]=1; link[x+1][y][1]=1; } if(i%2==0&&j%2!=0) { if (ch!=' ')continue; int x=i/2; int y=(j-1)/2; link[x][y][2]=1; link[x][y+1][4]=1; } } } for (int i=1;i<=n;i++) { if (!link[i][1][4])continue; ma=dist[i][1]=1; qx[++w]=i; qy[w]=1; } for (int i=1;i<=n;i++) { if (!link[i][m][2])continue; ma=dist[i][m]=1; qx[++w]=i; qy[w]=m; } for (int i=1;i<=m;i++) { if (!link[1][i][1])continue; ma=dist[1][i]=1; qx[++w]=1; qy[w]=i; } for (int i=1;i<=m;i++) { if (!link[n][i][3])continue; ma=dist[n][i]=1; qx[++w]=n; qy[w]=i; } bfs(); printf("%d",ma); }
——by zhber,转载请注明来源