poj迷宫游戏c语言代码,ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)

本文解析了如何使用BFS算法解决一个具有障碍的6x6棋盘迷宫问题,关键在于巧妙地记录障碍方向,以避免重复路径。通过增加每个点的阻碍方向数组,简化了对障碍的检查,提高了算法效率。最后给出了完整代码实现并分享了解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

POJ2935-Basic Wall Maze

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

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

//简单障碍迷宫问题

//三堵墙,6*6棋盘,从给定初始点到给定终点的最短路,输出同一最短路中任一路径

//难点在于阻碍的表示-可增加每个点的阻碍方向记录数组

//Memory:168K Time:0Ms

#include

#include

#include

using namespace std;

#define MAX 7

struct Point {

int size; //阻碍方向数

int block[]; //阻碍方向

bool v; //已访问

}board[MAX][MAX];

struct State {

int x, y;

int fa; //记录上一节点

char d; //记录到下一节点方向

}q[MAX*MAX + ];

int sx, sy, ex, ey;

int mov[][] = { {,}, {,}, {,-}, {-,} }; //东南西北

char d[] = "ESWN"; //东南西北

void get_block()

{

int x1, y1, x2, y2;

scanf("%d%d%d%d", &y1, &x1, &y2, &x2);

if (x1 > x2) swap(x1, x2);

if (y1 > y2) swap(y1, y2);

while (y1 == y2 && x1++ < x2) //竖式障碍

{

board[x1][y1].block[board[x1][y1].size++] = ;

int tx = x1 + mov[][];

int ty = y1 + mov[][];

board[tx][ty].block[board[tx][ty].size++] = ;

}

while(x1 == x2 && y1++ < y2) //横式障碍

{

board[x1][y1].block[board[x1][y1].size++] = ;

int tx = x1 + mov[][];

int ty = y1 + mov[][];

board[tx][ty].block[board[tx][ty].size++] = ;

}

}

//递归输出

void output(State t)

{

if (t.fa){

output(q[t.fa]);

printf("%c", t.d);

}

}

void bfs()

{

memset(q, , sizeof(q));

int front = , tail = ;

q[front].x = sx;

q[front].y = sy;

board[sx][sy].v = true;

while (front < tail)

{

int x = q[front].x;

int y = q[front].y;

for (int i = ; i < ; i++)

{

bool flag = true; //可以朝当前方向前进

for (int j = ; j < board[x][y].size; j++)

{

if (i == board[x][y].block[j])

{

flag = false; break;

}

}

if (flag) //可以前进

{

State t;

t.x = x + mov[i][];

t.y = y + mov[i][];

t.d = d[i];

t.fa = front;

if (t.x == ex && t.y == ey) //destination

{

output(t);

printf("\n");

return;

}

if (t.x > && t.x < MAX && t.y > && t.y < MAX && !board[t.x][t.y].v)

{

board[t.x][t.y].v = true;

q[tail++] = t;

}

}

}

front++;

}

}

int main()

{

while (scanf("%d%d", &sy, &sx), sy && sx)

{

scanf("%d%d", &ey, &ex);

memset(board, , sizeof(board));

for (int i = ; i < ; i++)

get_block();

//if (sx == ex && sy == ey)

// printf("\n");

//else

bfs();

}

return ;

}

ACM&sol;ICPC 之 BFS&lpar;离线&rpar;&plus;康拓展开&lpar;TSH OJ-玩具&lpar;Toy&rpar;&rpar;

祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...

ACM&sol;ICPC 之 BFS&plus;状态压缩&lpar;POJ1324&lpar;ZOJ1361&rpar;&rpar;

求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...

ACM&sol;ICPC 之 BFS范例&lpar;ZOJ2913-ZOJ1136&lpar;POJ1465&rpar;&rpar;

通过几道经典BFS例题阐述BFS思路 ZOJ2913-Bus Pass 题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的. 题解:经典的BFS,由 ...

ACM&sol;ICPC 之 BFS&lpar;离线&rpar;&plus;康拓展开 &lpar;HDU1430-魔板&rpar;

魔板问题,一道经典的康拓展开+BFS问题,为了实现方便,我用string类来表示字符串,此前很少用string类(因为不够高效,而且相对来说我对char数组的相关函数比较熟),所以在这里也发现了很多容 ...

HDU 5889 Barricade 【BFS&plus;最小割 网络流】&lpar;2016 ACM&sol;ICPC Asia Regional Qingdao Online&rpar;

Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

BFS简单题套路&lowbar;Codevs 1215 迷宫

BFS 简单题套路 1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明 ; struct Status { int r, c; Status(, ) : r(r), c(c) {} // ...

HDU 5876 Sparse Graph 【补图最短路 BFS】&lpar;2016 ACM&sol;ICPC Asia Regional Dalian Online&rpar;

Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

hduoj 4712 Hamming Distance 2013 ACM&sol;ICPC Asia Regional Online —— Warmup

http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...

ACM ICPC Kharagpur Regional 2017

ACM ICPC Kharagpur Regional 2017 A - Science Fair 题目描述:给定一个有\(n\)个点,\(m\)条无向边的图,其中某两个点记为\(S, T\),另外标 ...

随机推荐

&lpar;l老陈-小石头&rpar;典型用户、用户故事、用例图

一.典型用户 老陈 小石头 二.用户故事 老陈:作为一个家长,我希望能利用软件在电脑上储存一些数学题目,以便在繁忙的工作中也能帮助到孩子提高数学. 小石头:作为一个小学二年级的小学生,我希望能利用软件 ...

CSS - 如何实现强制不换行、自动换行、强制换行 以及 chrom默认焦点 IE下 Input 默认出现叉

*:focus {outline: none;} input::-ms-clear {display:none;} 一般的文字截断(适用于内联与块): .text-overflow { display ...

Web Service 性能测试工具比较

背景 希望选择一款Web Service性能测试工具,能真实模拟大量用户访问网站时的请求,从而获取服务器当前的请求处理能力(请求数/秒).以微信服务器为例,每个用户用独立的登录token,做各种操作, ...

吊炸天的 PHP 7 ,你值得拥有

2015年的夏天,虽然来得不算火热,但是在互联网技术的夏天,比任何一年都更为火热. 刚刚才结束了 月底的网易.支付宝.携程以及多家云存储厂商的接连故障的坏消息,6月上旬则迎来了编程语言界两大好消息,第 ...

Emacs Lisp 功能扩展集锦

http://docs.huihoo.com/homepage/shredderyin/emacs_elisp.html Emacs 具有超强的扩展性.这是当今没有任何其它编辑器可以比拟 的强大特点. ...

Uva - 177 - Paper Folding

If a large sheet of paper is folded in half, then in half again, etc, with all the folds parallel, t ...

Ajax 的优势和不足

Ajax 的优势 1. 不需要插件支持 Ajax 不需要任何浏览器插件,就可以被绝大多数主流浏览器所支持,用户只需要允许 JavaScript 在浏览器上执行即可. 2. 优秀的用户体验 这是 Aja ...

selenium span&lbrack;contains&rsqb;中使用变量

province = '湖南' driver.find_element_by_xpath('//span[contains(text(),"'+province+'").click ...

PID控制器开发笔记之十一:专家PID控制器的实现

前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部.再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是 ...

mongodb 关闭服务器

./mongo use admin db.shutdownServer() 啦啦啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值