写这题主要是记一下题型,(迷宫基础题、普适题型)
有一个 m×n 格的迷宫(表示有 m 行、n 列),其中有可走的也有不可走的,如果用 11 表示可以走,00 表示不可以走,文件读入这 m×n 个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用 −1−1 表示无路)。
优先顺序:左上右下。数据保证随机生成。
输入格式
第一行是两个数 m,n(1<m,n<15),接下来是 m 行 n 列由 11 和 00 组成的数据,最后两行是起始点和结束点。
输出格式
所有可行的路径,描述一个点时用 (x,y) 的形式,除开始点外,其他的都要用 ->
表示方向。
如果没有一条可行的路则输出 −1−1。
输入输出样例
输入
5 6 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 5 6
输出
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
#include<iostream>//个人不建议使用万能头文件,容易报错;(本篇代码使用了,编译通不过)
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int sum[50000][2];//用来记录每步的坐标;
int ax,ay,bx,by,k,pd;//ax,ay代表起点,bx,by代表终点,k是步数;
int cx[4]={0,-1,0,1};
int cy[4]={-1,0,1,0};//四个方向,左上右下;
bool temp[17][17];//标记:已经走过的路;
int map[17][17];//地图:1可走,0不可走;
void print()//输出函数;
{
if(pd==0)//pd:判断是否有解,有解=1,无解=0;
{
pd=1;
}
for(int h=0;h<=k-1;h++)
cout<<"("<<sum[h][0]<<","<<sum[h][1]<<")"<<"->"; //输出中途步骤;
cout<<"("<<bx<<","<<by<<")"<<endl;//输出终点;
}
void walk(int x,int y)//搜索回溯主体;
{
if(x==bx&&y==by)//到达边界;
{
print();//输出解;
return;
}
else
{
for(int i=0;i<=3;i++)
if(map[x+cx[i]][y+cy[i]]==1&&temp[x+cx[i]][y+cy[i]]==0)//判断下一步是否可以走,一方面判断路是否可走,另一方面判断自己是否走过这条路;
{
temp[x][y]=1;//走过的路打上标记;
sum[k][0]=x;
sum[k][1]=y;//记录当前的坐标
k++;//步数加1;
walk(x+cx[i],y+cy[i]);
temp[x][y]=0;
k--;
//回溯,这里的sum可以不用恢复;
}
}
}
int main()
{
int m,n;//矩阵长宽;
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>map[i][j];//输入地图;
cin>>ax>>ay;//起点;
cin>>bx>>by;//终点;
walk(ax,ay);//开始搜索;
if(pd==0)//判断是否有解,如果没有解,输出-1;
cout<<"-1";
return 0;
}