您的位置:首页 > 其它

2014.9.27模拟赛【栅栏迷宫】

2014-09-27 14:11 169 查看
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
,qy
;
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
[i][3])continue;
ma=dist
[i]=1;
qx[++w]=n;
qy[w]=i;
}
bfs();
printf("%d",ma);
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: