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 ...
随机推荐
- 经典SQL语句大全之提升
二.提升 1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)法一:select * into b from a where 1<>1(仅用于SQlServer)法 ...
- android 04 AbsoluteLayout
绝对布局:layout_x,layout_y:坐标精准定位 xml文件:不推荐使用 <AbsoluteLayout xmlns:android="http://schemas.andr ...
- Android自定义Notification并没有那么简单
背景 最近需要实现一个自定义Notification的功能.网上找了找代码,解决方案就是通过RemoteViews来实现.但是在实现过程中遇到不少问题,网上也没有很好的文章描述这些问题,所以在这里做个 ...
- (总结)CentOS Linux搭建SVN Server配置详解
PS:虽然在公司linux服务器上搭建过几次svn,但是时间长了,有些配置操作会忘掉,上网搜索的结果都不大满意,有幸在前几天看到一篇算是最满意的svn搭建文章,转载一下以备以后使用,原文地址 ...
- 10.29 morning
WPS转word太丑了 凑合看喽 第二题 [题目描述] 给你两个日期,问这两个日期差了多少毫秒. [输入格式] 两行,每行一个日期,日期格式保证为“YYYY-MM-DD hh:mm:ss ”这种形式. ...
- Rouh set 入门知识2(基础定义篇)
接上一篇,简单说明一下知识库的关系,设K1=(U,S1)和K2=(U,S2)为知识库 1.如果IND(S1)=IND(S2),即U/IND(S1)=U/IND(S2),则知识库K1与知识库K2是等价的 ...
- WisDom.Net 框架设计(三) 数据缓存
WisDom.Net --数据缓存 1.几种缓存方式 1.静态全局变量 C#静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明 ...
- HTML 5 Audio/Video DOM buffered 属性
1.实例1获取视频第一段缓冲范围部分,以秒计: myVid=document.getElementById("video1"); alert("Start: " ...
- 查询可用的Nuget服务地址
解决访问Nuget源失败问题 查询IP址址 nslookup nuget.org 如失败,通过google 的dns服务器查询 nslookup nuget.org 8.8.8.8 将得到的Ip地址加 ...
- startActivityForResult和setResult详解
http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html startActivityForResult与startActivi ...