ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)
题目确实简单,思路很容易出来,难点在于障碍的记录,是BFS迷宫问题中很经典的题目了。
POJ2935-Basic Wall Maze
题意:6*6棋盘,有三堵墙,求从给定初始点到给定终点的最短路,输出同一路长的最短路中的任一路径。
题解:BFS就不说了,对于障碍的记录,我的想法是针对每一个点都记录一次各方向上的情况。比如东边有障碍则在障碍两侧的点增加一个方向数组,用以记录左点的东侧和右点的西侧有障碍,在BFS扩展该方向时,增加一层循环判断一次该方向是否有障碍就行,时间度不会耗费很高,最坏时间度也少于O(4*普通迷宫问题)。
//简单障碍迷宫问题
//三堵墙,6*6棋盘,从给定初始点到给定终点的最短路,输出同一最短路中任一路径
//难点在于阻碍的表示-可增加每个点的阻碍方向记录数组
//Memory:168K Time:0Ms
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; #define MAX 7 struct Point {
int size; //阻碍方向数
int block[]; //阻碍方向
bool v; //已访问
}board[MAX][MAX]; struct State {
int x, y;
int fa; //记录上一节点
char d; //记录到下一节点方向
}q[MAX*MAX + ]; int sx, sy, ex, ey;
int mov[][] = { {,}, {,}, {,-}, {-,} }; //东南西北
char d[] = "ESWN"; //东南西北 void get_block()
{
int x1, y1, x2, y2;
scanf("%d%d%d%d", &y1, &x1, &y2, &x2);
if (x1 > x2) swap(x1, x2);
if (y1 > y2) swap(y1, y2);
while (y1 == y2 && x1++ < x2) //竖式障碍
{
board[x1][y1].block[board[x1][y1].size++] = ;
int tx = x1 + mov[][];
int ty = y1 + mov[][];
board[tx][ty].block[board[tx][ty].size++] = ;
}
while(x1 == x2 && y1++ < y2) //横式障碍
{
board[x1][y1].block[board[x1][y1].size++] = ;
int tx = x1 + mov[][];
int ty = y1 + mov[][];
board[tx][ty].block[board[tx][ty].size++] = ; }
} //递归输出
void output(State t)
{
if (t.fa){
output(q[t.fa]);
printf("%c", t.d);
}
} void bfs()
{
memset(q, , sizeof(q));
int front = , tail = ;
q[front].x = sx;
q[front].y = sy;
board[sx][sy].v = true;
while (front < tail)
{
int x = q[front].x;
int y = q[front].y;
for (int i = ; i < ; i++)
{
bool flag = true; //可以朝当前方向前进
for (int j = ; j < board[x][y].size; j++)
{
if (i == board[x][y].block[j])
{
flag = false; break;
}
} if (flag) //可以前进
{
State t;
t.x = x + mov[i][];
t.y = y + mov[i][];
t.d = d[i];
t.fa = front;
if (t.x == ex && t.y == ey) //destination
{
output(t);
printf("\n");
return;
}
if (t.x > && t.x < MAX && t.y > && t.y < MAX && !board[t.x][t.y].v)
{
board[t.x][t.y].v = true;
q[tail++] = t;
}
}
}
front++;
}
} int main()
{
while (scanf("%d%d", &sy, &sx), sy && sx)
{
scanf("%d%d", &ey, &ex); memset(board, , sizeof(board));
for (int i = ; i < ; i++)
get_block(); //if (sx == ex && sy == ey)
// printf("\n");
//else
bfs();
} return ;
}
ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)的更多相关文章
- ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))
祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...
- ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...
- ACM/ICPC 之 BFS范例(ZOJ2913-ZOJ1136(POJ1465))
通过几道经典BFS例题阐述BFS思路 ZOJ2913-Bus Pass 题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的. 题解:经典的BFS,由 ...
- ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)
魔板问题,一道经典的康拓展开+BFS问题,为了实现方便,我用string类来表示字符串,此前很少用string类(因为不够高效,而且相对来说我对char数组的相关函数比较熟),所以在这里也发现了很多容 ...
- HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- BFS简单题套路_Codevs 1215 迷宫
BFS 简单题套路 1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明 ; struct Status { int r, c; Status(, ) : r(r), c(c) {} // ...
- HDU 5876 Sparse Graph 【补图最短路 BFS】(2016 ACM/ICPC Asia Regional Dalian Online)
Sparse Graph Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)To ...
- hduoj 4712 Hamming Distance 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...
- ACM ICPC Kharagpur Regional 2017
ACM ICPC Kharagpur Regional 2017 A - Science Fair 题目描述:给定一个有\(n\)个点,\(m\)条无向边的图,其中某两个点记为\(S, T\),另外标 ...
随机推荐
- html页面 代码 编写的 一些 基本素养 约定 知识点
hmtl代码书写也要养成一段一段的 区块代码, 每个区块代码 进行 html的 功能注释 自由文字的获得: (lorem ipsum: 乱数假文, 哑元文字) lorem ipsum: lipsum等 ...
- iframe和frameset的使用
iframe是:inner frame的缩写, 必须指明src属性,不能直接在里面写内容, 否则不会显示. 可以载入html, *.图片文件, txt文件等等. html的属性中,表示长度高度的尺寸属 ...
- solr6.1-----mysql 数据导入-查询
此部分一定要细心,lz 中间错了一个细节,调了好长时间(汗).请严格按照步骤操作 新建core 步骤1: 在webapps中solrhome下新建一个文件夹名字叫做collection1(名字不固定, ...
- 黑客攻防技术宝典Web实战篇(三)web攻击方式总结
web攻击的手段无非就是使服务器资源耗尽,使服务器无法接收正常请求. 一.DDos攻击 二.DRDos攻击 三.慢攻击 与Ddos攻击相反,慢攻击并不是以多取胜,而是靠保持连接.
- height:100%和height:auto的区别
一直不明白height:100%和height:auto的区别,最近在制作前端页面时都用了height:100%;overflow:hidden; ,可是有些浏览器出现莫名的奇妙的问题,但换成heig ...
- sqlserver中将某数据库下的所有表字段名称为小写的改为大写
declare @name varchar(50), @newname varchar(50),@colname varchar(50) declare abc cursor for select ( ...
- .NET中的工作目录一览!
定义: 当前工作目录——进行某项操作的目的目录,会随着OpenFileDialog.SaveFileDialog等对象所确定的目录而改变. 当前执行目录——该进程从中启动的目录,即文件自身 ...
- 编译本地64位版本的hadoop-2.6.0
官方提供的hadoop-2.x版本貌似都是32位的,在64位机子下使用可能会报错,最好使用官方提供的源码进行本地编译,编译成适合本地硬件环境的64位软件包. 关于native Hadoop是使用J ...
- ie下获取上传文件全路径
ie下获取上传文件全路径,3.5之后的火狐是没法获取上传文件全路径的 /*获取上传文件路径*/ function getFilePath(obj) { var form = $(this).paren ...
- CSU 1328 近似回文词(2013湖南省程序设计竞赛A题)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 解题报告:中文题题意就不说了.还好数据不大,只有1000,枚举回文串的中心位置,然 ...