博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bfs】noip模拟赛 栅栏迷宫
阅读量:4654 次
发布时间:2019-06-09

本文共 2373 字,大约阅读时间需要 7 分钟。

1、栅栏迷宫

题目描述

田野上搭建了一个黄金大神专用的栅栏围成的迷宫。幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽W(1<=W<=38)及长H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数(就是从最“糟糕”的一点,走出迷宫的最少步数)。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,黄金大神让你必须只会水平或垂直地在X或Y轴上移动,你不能从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫:

+-+-+-+-+-+
|         |
+-+ +-+ + +
|     | | |
+ +-+-+ + +
| |     | 
+-+ +-+-+-+

如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。

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=

思路

这题其实很可怕!!

最讨厌的就是去找入口出口。。我虽然过了那是数据太水……你看题目描述可不可以迷宫就建一半剩一半放那儿,那暴力找出入口就根本不行。

解决方法应该是在外面开一个出入口,然后搜索进入整个图,如果不是找到真正的出入口就会多走没必要的路,这样程序会自动剔除这种情况

搜索的时候注意一下向四面搜索每次走两步即可

代码

#include 
#include
#include
#include
#include
using namespace std;struct note{ int x,y;}queue[200000];int p1[4][2]={
{-2,0},{
0,2},{
2,0},{
0,-2}};int p2[4][2]={
{-1,0},{
0,1},{
1,0},{
0,-1}};int a[500][500];int value[500][500];int head,tail,w,h;ifstream fin("maze.in");ofstream fout("maze.out");void input(){ fin>>w>>h; w=w*2+1;h=h*2+1; for (int i=1;i<=h;i++) { fin.get(); for (int j=1;j<=w;j++) { a[i][j]=fin.get(); if ( (i==1)&&(a[i][j]==' ') ) {tail++; queue[tail].x=i+1;queue[tail].y=j; value[i+1][j]=1;} if ( (i==h)&&(a[i][j]==' ') ) {tail++; queue[tail].x=i-1;queue[tail].y=j; value[i-1][j]=1;} if ( (j==1)&&(a[i][j]==' ') ) {tail++; queue[tail].x=i;queue[tail].y=j+1; value[i][j+1]=1;} if ( (j==w)&&(a[i][j]==' ') ) {tail++; queue[tail].x=i;queue[tail].y=j-1; value[i][j-1]=1;} } }}void bfs(){ head=0; int wx,wy,tx,ty,nx,ny; //wx,wy是p2的,tx,ty是p1的,nx,ny是现在的 while (head<=tail) { head++; for (int i=0;i<=3;i++) { tx=queue[head].x+p1[i][0];ty=queue[head].y+p1[i][1]; wx=queue[head].x+p2[i][0];wy=queue[head].y+p2[i][1]; if ( (tx>0)&&(tx
0)&&(ty
best) best=value[i][j]; fout<
<

结果

转载于:https://www.cnblogs.com/seekdreamer/p/4006228.html

你可能感兴趣的文章
使用VMware安装CentOS7详请
查看>>
AES && DES加解密
查看>>
[Android实例] Activity之间数据传递与共享的几种途径(bitmap篇)
查看>>
C#用Microsoft.Office.Interop.Word进行Word转PDF的问题
查看>>
什么是极限开发?
查看>>
Recommender Systems
查看>>
阿里巴巴的零知识证明[转]摘自科学松鼠会,作者奥卡姆剃刀
查看>>
Oracle 行迁移和行链接
查看>>
c++ windows下计时
查看>>
No. three
查看>>
杂诗4
查看>>
打印出A到Z的所有字符,使用char和int转换
查看>>
怎么用js设置a标签点击链接改变当前颜色
查看>>
jQuery源码浅析
查看>>
前端学习笔记day05 第一个页面--header部分
查看>>
Calculate difference between consecutive data points in a column from a file
查看>>
es6 String.raw()
查看>>
json格式字符串转字典
查看>>
HTML5新特性之History
查看>>
在线编辑器CKEditor,多图上传功能实现
查看>>