关于我被室友督促写博客这件事
题目链接https://www.luogu.com.cn/problem/P1238走迷宫
问题描述
有一个 m×n 格的迷宫(表示有 m 行、n 列),其中有可走的也有不可走的,如果用 1 表示可以走,0 表示不可以走,文件读入这m×n 个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用 -1 表示无路)。
优先顺序:左上右下。数据保证随机生成。
这是道很经典的走迷宫的题,唯一需要注意的就是逃出来的时候有一定的顺序并且还要输出路径。输出路径的时候我们可以用一个二维数组去存下走的点,最后在打印出来。
Code:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=17;
int x,y,n,m,q,w,l,f=0;//l 步数
int s[N][N];//图
int st[N][N];//判断是否走过
int path[1000000][2];//记录路径
int dx[]={0,-1,0,1};//有一定的顺序
int dy[]={-1,0,1,0};
void printf()//打印路径
{
if(f==0){f=1;}
cout<<"("<<q<<","<<w<<")"<<"->";
for(int i=0;i<l-1;i++)
{
cout<<"("<<path[i][0]<<","<<path[i][1]<<")"<<"->";
}
cout<<"("<<path[l-1][0]<<","<<path[l-1][1]<<")"<<endl;
}
void dfs(int a,int b)
{
if(a==x&&b==y)
{
printf();
return;
}
else
{
for(int i=0;i<4;i++)
{
int nx=a+dx[i];
int ny=b+dy[i];
if(nx>0&&ny>0&&nx<=n&&ny<=m&&st[nx][ny]==0&&s[nx][ny]==1)
{
st[nx][ny]=1;
path[l][0]=nx;
path[l][1]=ny;
l++;
dfs(nx,ny);
st[nx][ny]=0;
l--;
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie();
cout.tie();
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin>>s[i][j];
}
memset(path,0,sizeof(path));
cin>>q>>w;
cin>>x>>y;
st[q][w]=1;
dfs(q,w);
if(f==0) cout<<"-1"<<endl;
return 0;
}
新手勿喷😫😫😫