现在的位置: 首页 > 综合 > 正文

模拟赛 栅栏迷宫(时间限制:1000MS 空间限制:256MB)

2018年04月24日 ⁄ 综合 ⁄ 共 2185字 ⁄ 字号 评论关闭

题目描述

田野上搭建了一个黄金大神专用的栅栏围成的迷宫。幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽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;
}

抱歉!评论已关闭.