P1238 走迷宫
原题链接 https://www.luogu.org/problemnew/show/P1238
为了巩固一下刚学习的广搜,练一下迷宫类型的题 不过这道题我用的深搜.....
看问题,我们就知道这道题和平时做的走迷宫的题差不多,只是把方案数改成了输出路径
那也很好办,我们只要记录一下每一步的坐标,如果到了终点就输出记录下来的坐标就好了
注意题目中给出的优先顺序:左上右下 表示被坑了一次qaq
给出AC代码:
#include<iostream> #include<cstdio> using namespace std; int n,m,a[300][2]; int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0}; //注意题目中给出的顺序!!! 优先顺序:左上右下 int sx,sy,fx,fy,flag=0,t; //sx,sy表示起点横纵坐标,fx,fy表示终点横纵坐标 bool vis[16][16]; //判断是否到达过 bool map[16][16]; //地图 void search(int x,int y) { if(x==fx&&y==fy) //判断是否到终点 { for(int j=1;j<=t;j++) printf("(%d,%d)->",a[j][0],a[j][1]); //输出路径 printf("(%d,%d)\n",fx,fy); flag=1; //标记为有解 } for(int i=0;i<4;i++) //四个方向 { if(map[x+dx[i]][y+dy[i]]==1&&vis[x+dx[i]][y+dy[i]]==0&&x+dx[i]>=1&&x+dx[i]<=n&&y+dy[i]>=1&&y+dy[i]<=m) //判断是否在界内,以及该点是否到过和是否能走 { t++; //步数+1 vis[x][y]=1; //标记为1,表示该点已经走过 a[t][0]=x; //记录横坐标 a[t][1]=y; //记录纵坐标 search(x+dx[i],y+dy[i]); //深搜的递归思想~,进一步搜索下去 vis[x][y]=0; //回溯操作 t--; } } } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>map[i][j]; cin>>sx>>sy; cin>>fx>>fy; search(sx,sy); //开始搜索 if(flag==0) cout<<"-1"; //如果无解,则输出-1 return 0; }