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)
OUTPUT FORMAT:
(file maze.out)
善良的学长:样例输入可以复制进记事本或者文本文档这样看起来更加直观!!!=v=
广搜签到题……难度为负……就是读入的处理讨厌了点
考场上预处理没搞好才90……一定是因为昨晚打cf太迟今天没睡醒
田野上搭建了一个黄金大神专用的栅栏围成的迷宫。幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽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); }
相关文章推荐
- 2014.9.27模拟赛【栅栏迷宫】
- SNOI省选模拟赛Round5 T2 逃离迷宫escape 搜索+并查集+预处理剪枝+双联通分量?
- 清北学堂模拟赛d6t6 棋盘迷宫
- hdu1272 小希的迷宫--并查集
- JZOJ(中山纪中) 2018.01.26【NOIP普及组】模拟赛D组 第四题
- 栈的思想用于求解迷宫问题
- JZOJ(中山纪中) 2018.01.30【NOIP普及组】模拟赛D组 第三题
- 栈求解迷宫问题
- JZOJ(中山纪念中学) 2018.02.02【NOIP普及组】模拟赛D组
- 求取迷宫所有路径
- 基础搜索——dfs,bfs(全排列与迷宫问题)
- HDU 1272 小希的迷宫
- 随机生成一个迷宫并探索一条路径的JAVA实现
- 迷宫出路
- 迷宫(bfs)
- java 栈的实现以及栈的典型应用--字符平衡,中缀转后缀,后缀计算,迷宫求解等
- 逃离迷宫(BFS)题解
- 2016.4.23【初中部 GDOI 】模拟赛A与改题总结
- 迷宫求解(深搜)——递归和非递归
- 【并查集判环】HDU1272小希的迷宫【判环模板】