给定一个M行N列的迷宫图,其中 "0"表示可通路,"1"表示障碍物,无法通行。在迷宫中只允许在水平或上下四个方向的通路上行走,走过的位置不能重复走。

5行8列的迷宫如下:


则从左上角(1,1)至右下角(5,8)的最短路径为:

1,1--》2,1--》2,2--》2,3--》3,3--》3,4--》3,5--》4,5--》5,5--》5,6--》5,7--》5,8

题目保证每个迷宫最多只有一条最短路径。

请输出该条最短路径,如果不存在任何通路,则输出"NO FOUND".

输入格式:

第一行,输入M和N值,表示迷宫行数和列数。

接着输入M行数值,其中,0表示通路,1表示障碍物。每列数值用空格符间隔。

接下来可能输入多组迷宫数据。

当输入M的值为-1时结束输入。

输出格式:

按行顺序输出路径的每个位置的行数和列数,如 x,y

如果不存在任何路径,则输出"NO FOUND".

每组迷宫寻路结果用换行符间隔。

输入样例:

在这里给出一组迷宫。例如:

8 8
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0
0 1 1 1 0 0 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0
0 1 1 1 0 1 1 0
1 0 0 0 0 0 0 0
4 4
0 0 1 0
0 0 0 0
0 0 1 1
0 1 0 0
-1 -1

输出样例:

在这里给出相应的输出。例如:1,1

,
,
,
,
,
,
,
,
,
,
,
,
,
, NO FOUND


【答案,虽然是满分,但健壮性不一定,不想奋斗的,随意复制粘贴吧!】
#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class node
{
public:
int x,y;
node()
{ }
node(int ax,int ay)
{
x=ax;
y=ay;
}
};
int mv[][]={{,},{,-},{,},{-,}};
int vis[][];
int pre[][];
int main(int argc, char *argv[]) {
int m,n;
int aa=;
cin>>m>>n;
while(m!=-)
{
memset(vis,m*n,);
memset(pre,m*n,);
vector<vector<int> > v;
for(int i=;i<m;i++)
{
vector<int> t;
v.push_back(t);
for(int j=;j<n;j++)
{
int ta;
cin>>ta;
v[i].push_back(ta);
}
} queue<node> q;
q.push(node(,));
vis[][]=;
int f=;
while(!q.empty())
{
node qf = q.front();
if(qf.x==m-&&qf.y==n-)
{
f=; break; }
q.pop();
for(int i=;i<;i++)
{
node tt(qf.x+mv[i][],qf.y+mv[i][]);
if((tt.x>=&&tt.x<m&&tt.y>=&&tt.y<n)&&!vis[tt.x][tt.y]&&!v[tt.x][tt.y])
{
vis[tt.x][tt.y] =;
pre[tt.x][tt.y] =qf.x*n+qf.y;
q.push(tt);
//cout<<tt.x<<" "<<tt.y<<endl;
}
}
}
if(f)
{
stack<node> sn;
int xy = pre[m-][n-];
while(xy)
{ sn.push(node(xy/n+,xy%n+));
xy = pre[xy/n][xy%n];
}
cout<<"1,1"<<endl; while(!sn.empty())
{
cout<<sn.top().x<<","<<sn.top().y<<endl;
sn.pop();
}
cout<<m<<","<<n<<endl<<endl; }else
{
cout<<"NO FOUND"<<endl;
}
cin>>m>>n;
} return ;
}

【献给那些努力奋斗的同学儿,努力学习为国争光!】

#include <iostream>
#include <string.h>
using namespace std;
/*
*迷宫最短路径
*迷宫数组是从1 开始
*/
int n,m,p,q,Min=;//迷宫n行m列,出口位置(p,q)
int a[][]={};//迷宫数组
int book[][]={};//标记是否走过
int next[][]={{,},{,},{,-},{-,}};//向下,向右,向上,向左 int stepA[][]={-};//记录当前路径
int stepB[][]={-};//记录最小路径 void dfs(int x,int y,int step)
{
int tx,ty,k;
if(x==p&&y==q)
{
if(step<Min)
{
for(int t=;t<;t++)
{
if(stepA[t][]==-&&stepA[t][]==-)
{
break;
}
stepB[t][]=stepA[t][];
stepB[t][]=stepA[t][];
} Min=step;
}
return;
} for(k=;k<=;k++)
{
//计算下一点的坐标
tx=x+next[k][];
ty=y+next[k][];
if(tx<||tx>n||ty<||ty>m)
continue; if(a[tx][ty]==&&book[tx][ty]==)
{
stepA[step][]=tx;
stepA[step][]=ty; book[tx][ty]=;//标记已经走过了这个点
dfs(tx,ty,step+);//尝试下一个点
book[tx][ty]=;//取消这个点的标记
}
}
return;
}
int main()
{
int startx=,starty=;
cout<<"请输入迷宫的大小(行、列):"<<endl;
cin>>n>>m;
cout<<"请输入迷宫布局('0'代表通路,'1'代表墙):"<<endl;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
cin>>a[i][j];
}
}
cout<<"请输入起点与终点坐标:" <<endl;
cin>>startx>>starty>>p>>q;
book[startx][starty]=;
dfs(startx,starty,);
if(Min==)//没有最短路径就说明没有通路
{
cout<<'\n'<<"【提示】两点之间没有通路!"<<endl;
return ;
}
cout<<"走出迷宫最少步数:"<<endl;
cout<<Min<<endl;
cout<<"迷宫最短路径:"<<endl;
for(int t=;t<Min;t++)
{
if(t==)
cout<< startx<<" "<<starty<<endl;
cout<<stepB[t][]<<" "<<stepB[t][]<<endl; }
return ;
}
代码截图:【帅不帅气,一给我里giaogiao】

												

PTA-迷宫寻路(输出最短路径)的更多相关文章

  1. PTA7-1 迷宫寻路 (20分)

    7-1 迷宫寻路 (20分) 给定一个M行N列的迷宫图,其中 "0"表示可通路,"1"表示障碍物,无法通行.在迷宫中只允许在水平或上下四个方向的通路上行走,走过 ...

  2. C++ 迷宫寻路问题

    迷宫寻路应该是栈结构的一个非常经典的应用了, 最近看数据结构算法应用时看到了这个问题, 想起来在校求学时参加算法竞赛有遇到过相关问题, 感觉十分亲切, 在此求解并分享过程, 如有疏漏, 欢迎指正 问题 ...

  3. POJ - 3984迷宫问题(最短路径输出)

    题目链接:http://poj.org/problem?id=3984 题目: 迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  4. - 迷宫问题 POJ - 3984 bfs记录路径并输出最短路径

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  5. 51 NOd 1459 迷宫游戏 (最短路径)

    1459 迷宫游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...

  6. [POJ 3984] 迷宫问题(BFS最短路径的记录和打印问题)

    题目链接:http://poj.org/problem?id=3984 宽度优先搜索最短路径的记录和打印问题 #include<iostream> #include<queue> ...

  7. dijkstra算法计算最短路径和并输出最短路径

    void dijisitela(int d, int m1) { ], book[], path[], u, v, min; l = ; ; i < n1; i++) { dis[i] = w[ ...

  8. PTA 中序输出叶子结点

    6-8 中序输出叶子结点 (10 分)   本题要求实现一个函数,按照中序遍历的顺序输出给定二叉树的叶结点. 函数接口定义: void InorderPrintLeaves( BiTree T); T ...

  9. NEFU 558 迷宫寻路

    题目链接 简单搜索题 #include <cstdio> #include <iostream> #include <cstring> using namespac ...

随机推荐

  1. JVM(四),什么是反射

    四.什么是反射 1.反射理论 2.反射实践 (1)创建Robot类 public class Robot { private String name; public void sayHi(String ...

  2. [集训队作业2018]蜀道难——TopTree+贪心+树链剖分+链分治+树形DP

    题目链接: [集训队作业2018]蜀道难 题目大意:给出一棵$n$个节点的树,要求给每个点赋一个$1\sim n$之内的权值使所有点的权值是$1\sim n$的一个排列,定义一条边的权值为两端点权值差 ...

  3. 20175214 MySort(选做)

    一.题目要求 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实现.提交博客链接. 二.设计思路 在命令行中输入需要的参 ...

  4. LeetCode 6. Z字形变换(ZigZag Conversion)

    题目描述 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:"P ...

  5. LeetCode 230. 二叉搜索树中第K小的元素(Kth Smallest Element in a BST)

    题目描述 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 示例 1: 输入: roo ...

  6. linux常用查看系统操作的linux命令

    系统# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostna ...

  7. Sticky广播

    sticky广播通过Context.sendStickyBroadcast()函数来发送,用此函数发送的广播会一直滞留,当有匹配此广播的广播接收器被注册后,该广播接收器就会收到此条信息. 使用此函数需 ...

  8. php中应用memcached

    PHP连接Memcached 先安装php的memcache扩展 # wget  http://ip/data/attachment/forum/memcache-2.2.3.tgz# tar zxf ...

  9. 內部作业 OH01 0001710000 无价格可确定

    在CO15报工时,提示:“內部作業 OH01 0001710000 無價格可確定” 出现以上错误信息,表示没有在KP26维护价格, 只需要进入KP26维护成本中心和作业类型的价格即可, 具体操作如下图 ...

  10. linux常用命令(12)head命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾.1 命令格式head [ ...