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的更多相关文章

  1. HDU 1484 Basic wall maze (dfs + 记忆)

    Basic wall maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. poj-2935 BFS Basic Wall Maze

    Basic Wall Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3384   Accepted: 1525   ...

  3. 【HDOJ】1484 Basic wall maze

    BFS. /* 1484 */ #include <iostream> #include <queue> #include <string> #include &l ...

  4. poj 2935 Basic Wall Maze

    是一个图论的基础搜索题- 没什么好说的就是搜索就好 主要是别把 代码写的太屎,错了不好找 #include<cstdio> #include<algorithm> #inclu ...

  5. (BFS)poj2935-Basic Wall Maze

    题目地址 题目与最基本的BFS迷宫的区别就是有一些障碍,可以通过建立三维数组,标记某个地方有障碍不能走.另一个点是输出路径,对此建立结构体时要建立一个pre变量,指向前一个的下标.这样回溯(方法十分经 ...

  6. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  7. poj 2395 bfs/记录路径

    http://poj.org/problem?id=2935 Basic Wall Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  8. ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)

    题目确实简单,思路很容易出来,难点在于障碍的记录,是BFS迷宫问题中很经典的题目了. POJ2935-Basic Wall Maze 题意:6*6棋盘,有三堵墙,求从给定初始点到给定终点的最短路,输出 ...

  9. Clojure——学习迷宫生成

    背景 初学clojure,想着看一些算法来熟悉clojure语法及相关算法实现. 找到一个各种语言生成迷宫的网站:http://rosettacode.org/wiki/Maze_generation ...

随机推荐

  1. RHCA-RH442-Linux系统性能调优 (学习)

    RHCA-RH442-Linux系统性能调优

  2. Dapper Use For Net

    Dapper.Net by example januari 6, 2012 When the team behind StackOverflow released the mini-ORM Dappe ...

  3. iOS开发之支付宝集成

    项目中要用到支付功能,需要支付宝,微信,银联三大支付,所以打算总结一下,写两篇文章,方便以后的查阅, 大家在做的时候也能稍微参考下,用到的地方避免再次被坑.这是第二篇支付宝集成,第一篇银联支付在这里. ...

  4. Java基础知识强化之集合框架笔记26:LinkedList的特有功能

    1. LinkedList的特有功能: (1)添加功能  public  void  addFirst(Object   e)  public  void  addLast(Object   e) ( ...

  5. 适配器控件-Adapter

    适配器对象派生自Android.widget.Adapter,它的作用包括:构造列表项控件,并将数据项绑定到列表项控件中. 常见的适配器有:数组适配器 ArrayAdapter,数据库适配器 Curs ...

  6. poj 3565 ants

    /* poj 3565 递归分治 还有用KM的做法 这里写的分治 按紫书上的方法 不过那里说的有点冗杂了 可以简化一下 首先为啥可以分治 也就是分成子问题解决 只要有一个集合 黑白的个数相等 就一定能 ...

  7. ftp不能上传解决办法

    自己的服务器,然后我分好ftp,有一天,有个客户要传东西,发现怎么也传不上,但是可以下载,,,,弄了半天,目录权限也是完全访问,但还是不行,原来是serv-u分配的空间小了啊,所以只能下载不能上传.. ...

  8. angularjs kindEditor 中自定义按钮 弹出dialog

    1.angular-kindeditor.js 第38行左右加 editorConfig.items = ["placehoder"]; 2.en.js 第234行 placeho ...

  9. recursive - simple screenshot but detail principle.

    the code below demonstates the principle of the'recursive-call' that the programing beginner may be ...

  10. dnsever 邮件记录

    记录,备忘