PTA迷宫探路

编程入门 行业动态 更新时间:2024-10-11 23:25:10

PTA<a href=https://www.elefans.com/category/jswz/34/1769354.html style=迷宫探路"/>

PTA迷宫探路

本题目要求读入2个整数A和B,表示A行B列的迷宫,迷宫中有障碍点。给定起始点和终止点,要求从起始点到终止点的最小步数。

输入格式:

输入n组如下的数:
输入2个整数A和B,表示A行B列的迷宫,然后输入一个整数C,表示障碍点数,再依次输入C个障碍点的坐标(x,y),最后输入起始点和终止点的坐标(xs,ys)和(xe,ye)。

输出格式:

针对每组数,输出从起始点到终止点的最小步数。若无法达到,则输出“Not arrive”。

 注意两种情况:入口和出口不重合,重合


#include <bits/stdc++.h>
using namespace std;
int aa[25][25];//地图
int flag[25][25];//走过的路径标记
int x00, y00;//迷宫起点
int x11, y11;//迷宫出口int fx[] = { 0, 0, -1, 1 };
int fy[] = { -1, 1, 0, 0 };int a, b, c;//行列大小、障碍物数量int sum = 1 << 30;//假设一个很大的路径步数stack<pair<int,int>>p;//用于存放路径(x,y)的栈void bfs(int x,int y)//广搜   
{if (x == x11 && y == y11)//如果符合条件,return;{sum = min(sum, (int)p.size());//利用栈的size,取得最小路径步数return;}for (int i = 0; i < 4; i++)//循环判断,某个点的周边四个点是否为合法路径{int xx = x + fx[i], yy = y + fy[i];//得到周围点的坐标if (aa[xx][yy] == -1)continue;//如果是障碍物,跳过,判断下一个点if (xx < 0 || xx >= a || yy < 0 || yy >= b)continue;//出界,跳过if (flag[xx][yy])continue;//已经走过,跳过flag[xx][yy] = 1;//满足上述所有条件,判断此点为合法点,标记为1,表示第一次到达p.push({ xx,yy });//压入路径栈bfs(xx, yy);//递归判断,此点周围四个点是否合法p.pop();//这里只能是从出口return回来的,表示pop出口点,flag[xx][yy] = 0;//回溯,将出口重新标记为没有走过的点}
}int main()
{int t;cin >> t;while (t--){cin >> a >> b;cin >> c;for (int i = 1; i <= c; i++){int cx, cy;cin >> cx;cin >> cy;aa[cx][cy] = -1;}cin >> x00 >> y00;cin >> x11 >> y11;sum = 1 << 30;//刷新sum的值为一个很大的数p.push({ x00,y00 });//压入入口点flag[x00][y00] = 1;//标记入口点bfs(x00,y00);//开始递归判断while (p.size())//清空路径栈{p.pop();}memset(aa, 0, sizeof(aa));//清空地图和标记memset(flag, 0, sizeof(flag));if (sum < 9999)//如果没有到达出口的路径,则sum没有被更新过,是一个很大的数cout << sum - 1;elsecout << "Not arrive";if (t > 0)cout << endl;}return 0;
}

更多推荐

PTA迷宫探路

本文发布于:2024-03-07 14:50:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1718118.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:迷宫   PTA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!