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

题目确实简单,思路很容易出来,难点在于障碍的记录,是BFS迷宫问题中很经典的题目了。



POJ2935-Basic Wall Maze

  题意:6*6棋盘,有三堵墙,求从给定初始点到给定终点的最短路,输出同一路长的最短路中的任一路径。

  题解:BFS就不说了,对于障碍的记录,我的想法是针对每一个点都记录一次各方向上的情况。比如东边有障碍则在障碍两侧的点增加一个方向数组,用以记录左点的东侧和右点的西侧有障碍,在BFS扩展该方向时,增加一层循环判断一次该方向是否有障碍就行,时间度不会耗费很高,最坏时间度也少于O(4*普通迷宫问题)。

  

  1 //简单障碍迷宫问题
  2 //三堵墙,6*6棋盘,从给定初始点到给定终点的最短路,输出同一最短路中任一路径
  3 //难点在于阻碍的表示-可增加每个点的阻碍方向记录数组
  4 //Memory:168K    Time:0Ms
  5 #include<iostream>
  6 #include<cstring>
  7 #include<cstdio>
  8 using namespace std;
  9
 10 #define MAX    7
 11
 12 struct Point {
 13     int size;        //阻碍方向数
 14     int block[3];    //阻碍方向
 15     bool v;        //已访问
 16 }board[MAX][MAX];
 17
 18 struct State {
 19     int x, y;
 20     int fa;        //记录上一节点
 21     char d;        //记录到下一节点方向
 22 }q[MAX*MAX + 1];
 23
 24 int sx, sy, ex, ey;
 25 int mov[4][2] = { {0,1}, {1,0}, {0,-1}, {-1,0} };    //东南西北
 26 char d[5] = "ESWN";    //东南西北
 27
 28 void get_block()
 29 {
 30     int x1, y1, x2, y2;
 31     scanf("%d%d%d%d", &y1, &x1, &y2, &x2);
 32     if (x1 > x2) swap(x1, x2);
 33     if (y1 > y2) swap(y1, y2);
 34     while (y1 == y2 && x1++ < x2)    //竖式障碍
 35     {
 36         board[x1][y1].block[board[x1][y1].size++] = 0;
 37         int tx = x1 + mov[0][0];
 38         int ty = y1 + mov[0][1];
 39         board[tx][ty].block[board[tx][ty].size++] = 2;
 40     }
 41     while(x1 == x2 && y1++ < y2)    //横式障碍
 42     {
 43         board[x1][y1].block[board[x1][y1].size++] = 1;
 44         int tx = x1 + mov[1][0];
 45         int ty = y1 + mov[1][1];
 46         board[tx][ty].block[board[tx][ty].size++] = 3;
 47
 48     }
 49 }
 50
 51 //递归输出
 52 void output(State t)
 53 {
 54     if (t.fa){
 55         output(q[t.fa]);
 56         printf("%c", t.d);
 57     }
 58 }
 59
 60 void bfs()
 61 {
 62     memset(q, 0, sizeof(q));
 63     int front = 1, tail = 2;
 64     q[front].x = sx;
 65     q[front].y = sy;
 66     board[sx][sy].v = true;
 67     while (front < tail)
 68     {
 69         int x = q[front].x;
 70         int y = q[front].y;
 71         for (int i = 0; i < 4; i++)
 72         {
 73             bool flag = true;    //可以朝当前方向前进
 74             for (int j = 0; j < board[x][y].size; j++)
 75             {
 76                 if (i == board[x][y].block[j])
 77                 {
 78                     flag = false; break;
 79                 }
 80             }
 81
 82             if (flag)    //可以前进
 83             {
 84                 State t;
 85                 t.x = x + mov[i][0];
 86                 t.y = y + mov[i][1];
 87                 t.d = d[i];
 88                 t.fa = front;
 89                 if (t.x == ex && t.y == ey)        //destination
 90                 {
 91                     output(t);
 92                     printf("\n");
 93                     return;
 94                 }
 95                 if (t.x > 0 && t.x < MAX && t.y > 0 && t.y < MAX && !board[t.x][t.y].v)
 96                 {
 97                     board[t.x][t.y].v = true;
 98                     q[tail++] = t;
 99                 }
100             }
101         }
102         front++;
103     }
104 }
105
106 int main()
107 {
108     while (scanf("%d%d", &sy, &sx), sy && sx)
109     {
110         scanf("%d%d", &ey, &ex);
111
112         memset(board, 0, sizeof(board));
113         for (int i = 0; i < 3; i++)
114             get_block();
115
116         //if (sx == ex && sy == ey)
117         //    printf("\n");
118         //else
119         bfs();
120     }
121
122     return 0;
123 }
时间: 2024-10-12 14:17:49

ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)的相关文章

ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))

求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其到(1,1)的最短路长 题解:开始做的时候用BFS暴力做了一次,结果RE了,后来看了其他的题解和discuss才转向状态压缩.也看到有人用A*做出来了. 现在简要介绍一下状态压缩的思路: 由于蛇身最长只有8,可以利用两条相邻蛇身坐标确定其相对方向(四个方向),两位二进制可以表示 这样 一个蛇头坐标+

ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)

魔板问题,一道经典的康拓展开+BFS问题,为了实现方便,我用string类来表示字符串,此前很少用string类(因为不够高效,而且相对来说我对char数组的相关函数比较熟),所以在这里也发现了很多容易被忽视的问题. 对于康拓展开不太熟系的可以先参看一篇博客:http://blog.csdn.net/zhongkeli/article/details/6966805 关于sting类,大家要注意,在赋值的时候,其赋值位置不能与首位置间存在未赋值部分. 题目需要转换思路的地方是: 我们需要将起始魔

ACM/ICPC 之 BFS范例(ZOJ2913)

通过一道经典BFS例题阐述BFS思路 ZOJ2913-Bus Pass 题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的. 题解:经典的BFS,由公交线路最多只经过10*20个区域,而总区域数可达10^5个,因此应该从公交线路通过队列一层层向外扩展,最后判断一次center的位置即可. 1 //选定一个center使得其到所有公交线路最短 2 //对所有公交线路进行BFS(公交线路比其他区域少得多) 3 //Time:150Ms Memory

bfs简单应用----迷宫问题

[week2-A] 东东有一张地图,想通过地图找到妹纸.地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0.既然已经知道了地图,那么东 东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线. Input 输入是一个5 × 5的二维数组,仅由0.1两数字组成,表示法阵地图. Output 输出若干行,表示从左上角到右下角的最短路径依次经过的坐标,格式如样例所示.数据保证有唯一解. Sample Input 0 1 0 0 00 1 0 1 00 1 0

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 Submission(s): 997    Accepted Submission(s): 306 Problem Description The empire is under attack again. The general of empire is planning to defend his

ACM:图的BFS,走迷宫

题目: 一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1表示),要么是障碍物(用0来表示).你的任务是找一条从起点到终点的最短移动序列,其中UDLR分别表示往上.下.左.右移动到相邻单元格.任何时候都不能在障碍格中,也不能走到迷宫之外.起点和终点保证是空地. 分析:图的BFS. #include <iostream> #include <string> #include <queue> using namespace std; const int MAXN

BFS简单题套路_Codevs 1215 迷宫

BFS 简单题套路 1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明 const int maxn = 20; struct Status { int r, c; Status(int r = 0, int c = 0) : r(r), c(c) {} // int DIR; }; int N; //迷宫数量 int W; //迷宫宽度 char map[maxn][maxn]; //地图 //方向 : 分别代表 上.右.下.左向量 int dir[4][2] = { {-1, 0

ACM/ICPC 之 数据结构-邻接表+BFS(TshingHua OJ-无线广播Broadcast)

这道题中若能够构成互不干扰的区域,其构成的图其实就是汉密尔顿路(Hamilton road),因此如果能够观察出来可以直接转化为汉密尔顿路的存在性证明,即便不能观察,我相信ACMer也能转化为BFS问题,这道题是一道很好的图论问题,对考察自己图论的基本功很有帮助. 无线广播(Broadcast) 描述 某广播公司要在一个地区架设无线广播发射装置.该地区共有n个小镇,每个小镇都要安装一台发射机并播放各自的节目. 不过,该公司只获得了FM104.2和FM98.6两个波段的授权,而使用同一波段的发射机

《ACM/ICPC 算法训练教程》读书笔记一之数据结构(堆)

书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了集训队final的意见买的,感觉还是不错滴. 相对于其他ACM书籍来说,当然如书名所言,这是一本算法训练书,有着大量的算法实战题目和代码,尽管小编还是发现了些许错误= =,有部分注释的语序习惯也有点不太合我的胃口.实战题目较多是比较水的题,但也正因此才能帮助不少新手入门,个人认为还是一本不错的算法书,当然自学还是需要下不少