Basic Wall Maze
poj2935:http://poj.org/problem?id=2935
题意:在6*6的格子中,有一些,如果两个格子之间有墙的话,就不能直接相通,问最少要经过几步才能从起点走到终点。并且输出路径。
题解:直接bfs
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
struct Node{
int sal;
char path[]; }; //用来记录当前节点的到起点的最小值以及取得这个最小值所对应的路径
int sx ,sy,dx,dy;//记录起点和终点坐标
Node mit[][];
struct Node1{
int x;
int y;
int step;
};//记录当前节点的坐标和对应的步数
struct point{
int up,down,left,right; }; //记录该节点的上下左右是否有墙壁
point map[][];
Node bfs(){
queue<Node1>Q;
Node1 temp;
temp.x=sx;
temp.y=sy;
temp.step=;
Q.push(temp);
while(!Q.empty()){
Node1 tmp;
tmp=Q.front();
Q.pop();
int xx=tmp.x;
int yy=tmp.y;
if(yy>=&&map[xx][yy].up==&&tmp.step+<mit[xx][yy-].sal){//向周围四个方向收索,满足条件就放进队列
Node1 tt;
tt.x=xx;
tt.y=yy-;
tt.step=tmp.step+;
mit[xx][yy-].sal=tmp.step+;
for(int i=;i<=mit[xx][yy].sal;i++){
mit[xx][yy-].path[i]=mit[xx][yy].path[i];
}
mit[xx][yy-].path[mit[xx][yy-].sal]='N'; //这里是把更新当前节点的路径
Q.push(tt); //通过复制前一步的路径,以及加上这一步的路径来实现
}
if(yy<&&map[xx][yy].down==&&tmp.step+<mit[xx][yy+].sal){
Node1 tt;
tt.x=xx;
tt.y=yy+;
tt.step=tmp.step+;
mit[xx][yy+].sal=tmp.step+;
for(int i=;i<=mit[xx][yy].sal;i++){
mit[xx][yy+].path[i]=mit[xx][yy].path[i];
}
mit[xx][yy+].path[mit[xx][yy+].sal]='S';
Q.push(tt); } if(xx>=&&map[xx][yy].left==&&tmp.step+<mit[xx-][yy].sal){
Node1 tt;
tt.x=xx-;
tt.y=yy;
tt.step=tmp.step+;
mit[xx-][yy].sal=tmp.step+;
for(int i=;i<=mit[xx][yy].sal;i++){
mit[xx-][yy].path[i]=mit[xx][yy].path[i];
}
mit[xx-][yy].path[mit[xx-][yy].sal]='W';
Q.push(tt); }
if(xx<&&map[xx][yy].right==&&tmp.step+<mit[xx+][yy].sal){
Node1 tt;
tt.x=xx+;
tt.y=yy;
tt.step=tmp.step+;
mit[xx+][yy].sal=tmp.step+;
for(int i=;i<=mit[xx][yy].sal;i++){
mit[xx+][yy].path[i]=mit[xx][yy].path[i];
}
mit[xx+][yy].path[mit[xx+][yy].sal]='E';
Q.push(tt);
} }
return mit[dx][dy]; } int main(){ while(~scanf("%d%d",&sx,&sy)){
if(sx==&&sy==)break;
scanf("%d%d",&dx,&dy);
for(int i=;i<=;i++)
for(int j=;j<=;j++){
map[i][j].up=map[i][j].down=map[i][j].left=map[i][j].right=;
} //初始化图
for(int i=;i<=;i++){
map[i][].up=;
map[i][].down=;
map[][i].left=;
map[][i].right=;
} //这里是对第一行和最后一行以及第一列和最后一列做特殊处理
int x1,y1,x2,y2;
for(int i=;i<=;i++){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1==x2)//竖的放的(对墙壁的处理)
for(int i=y1+;i<=y2;i++)
{ if(x1>)
map[x1][i].right=;
if(x1<)
map[x1+][i].left=;
}
if(y1==y2){ //横着放着
for(int i=x1+;i<=x2;i++){
if(y1>)
map[i][y1].down=;
if(y1<)
map[i][y1+].up=; }
}
}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
mit[i][j].sal=;
mit[sx][sy].sal=;//注意这里的初始化
Node ans=bfs();
for(int i=;i<=ans.sal;i++)
printf("%c",ans.path[i]);//打出路径
printf("\n");
}
}
Basic Wall Maze的更多相关文章
- HDU 1484 Basic wall maze (dfs + 记忆)
Basic wall maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- poj-2935 BFS Basic Wall Maze
Basic Wall Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3384 Accepted: 1525 ...
- 【HDOJ】1484 Basic wall maze
BFS. /* 1484 */ #include <iostream> #include <queue> #include <string> #include &l ...
- poj 2935 Basic Wall Maze
是一个图论的基础搜索题- 没什么好说的就是搜索就好 主要是别把 代码写的太屎,错了不好找 #include<cstdio> #include<algorithm> #inclu ...
- (BFS)poj2935-Basic Wall Maze
题目地址 题目与最基本的BFS迷宫的区别就是有一些障碍,可以通过建立三维数组,标记某个地方有障碍不能走.另一个点是输出路径,对此建立结构体时要建立一个pre变量,指向前一个的下标.这样回溯(方法十分经 ...
- HOJ题目分类
各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...
- poj 2395 bfs/记录路径
http://poj.org/problem?id=2935 Basic Wall Maze Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)
题目确实简单,思路很容易出来,难点在于障碍的记录,是BFS迷宫问题中很经典的题目了. POJ2935-Basic Wall Maze 题意:6*6棋盘,有三堵墙,求从给定初始点到给定终点的最短路,输出 ...
- Clojure——学习迷宫生成
背景 初学clojure,想着看一些算法来熟悉clojure语法及相关算法实现. 找到一个各种语言生成迷宫的网站:http://rosettacode.org/wiki/Maze_generation ...
随机推荐
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET ...
- Android 官方文档:(二)应用清单 —— 2.2 <action>标签
syntax: <action android:name="string" /> contained in: <intent-filter> descrip ...
- Java学习笔记六(I/O流)
1.介绍 在实际开发过程中经常会用到数据的输入/输出操作,本篇博客着重分析一下,java中经经常使用到的有关IO操作的类.而在java中能够将经常使用的流分为两个部分:字节流和字符流. 1.流的抽象基 ...
- 移植opencv库到zedboard(制作运行库镜像) 分类: OpenCV ZedBoard ubuntu shell Eye_Detection 2014-11-08 18:48 172人阅读 评论(0) 收藏
主要参考rainysky的博客 http://ledage.eefocus.com/sj229335457/blog/13-06/295352_ad954.html opencv的话只需要将lib这个 ...
- java不求有功,但求无过—异常处理
在程序开发中,错误往往有两种.一种是编译时出现的错误,该种错误比較easy发现.还有一种是执行时出现的错误,该种错误是开发者比較头疼的.异常就是一个执行时的错误,比如,除数为0 ,数组越界等. 异常处 ...
- Android 颜色渲染(四) BitmapShader位图渲染
版权声明:本文为博主原创文章,未经博主允许不得转载. Android 颜色处理(四) BitmapShader位图渲染 public BitmapShader(Bitmap bitmap,Shad ...
- good page
http://www.cnblogs.com/zrtqsk/category/540486.html
- android 19 activity纵横屏切换的数据保存与恢复
Bundle类:竖屏的activity换到横屏的activity的时候,会把竖屏的activity杀掉横屏的activity创建,竖屏的activity会有一些计算结果,可以用数据存起来,存到内存里面 ...
- 关于C++的疑问剖析
1)众所周知,抽象类是不存在对象的,只提供接口而不提供实现.但是抽象类能不能作为一个类指针,指向其子类的对象呢? class Interface { public: ; }; class Implem ...
- 禁止鼠标多次点击选中div中的文字
<!DOCTYPE html><html><head><meta charset="utf-8"><title>Fire ...