2014.9.27模拟赛【栅栏迷宫】

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,转载请注明来源
原文地址:https://www.cnblogs.com/zhber/p/4035900.html