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 ...
随机推荐
- kswapd0、kjournald、pdflush、kblocked、migration进程含义 转
kswapd0.kjournald.pdflush.kblocked.migration进程含义 1.kswapd0 Linux uses kswapd for virtual memory mana ...
- Java SE 6 新特性: 编译器 API
新 API 功能简介 JDK 6 提供了在运行时调用编译器的 API,后面我们将假设把此 API 应用在 JSP 技术中.在传统的 JSP 技术中,服务器处理 JSP 通常需要进行下面 6 个步骤: ...
- html+css3实现网页时钟
在网页上实现时钟功能,效果如右图所示: 运用到的关键技术有:css3中的旋转.旋转基点设置 旋转:transform:rotate(*deg) 旋转基点:transform-origin: x轴偏移 ...
- linux 命令终端提示符显示-bash-4.1#解决方法
昨天在配置linux,突然发现root登录的CRT的终端提示符显示的是-bash-4.1# 而不是root@主机名 + 路径的显示方式.搞了半天也不知道为什么出现这种情况.今天终于搞定这个问题, 原因 ...
- C# 通过hessian调Java注意事项
照理说C#可以通过标准的web服务可以轻松地调用Java,但是鉴于hessian的高性能及开发效率,个人认为C#通过hessian调用java是很值得提倡的.之前完成的一个比较大型的企业应用项目就是采 ...
- 一条sql语句循环插入N条不同记录(转)
SET NOCOUNT ON IF (OBJECT_ID('TB' ) IS NOT NULL ) DROP TABLE TB GO CREATE TABLE TB(ID INT IDENTITY ( ...
- 导入Android工程源码出现乱码问题的解决方法
可以尝试着从以下三个方法进行调试,一般情况下会完美解决的: 1.windows->Preferences->General->Content Types->Text->J ...
- Mac开机黑屏解决办法
开机黑屏问题 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !import ...
- Linux系统、版本、CPU、内存查看、硬盘空间
查看系统版本:lsb_release -a [root@localhost /]# lsb_release -a LSB Version: :core-4.0-amd64:core-4.0-no ...
- Linux内存点滴:用户进程内存空间
原文出处:PerfGeeks 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的.VIRT , Virtual Image (kb)RES, Residen ...