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;
}

 

posted @ 2019-04-17 21:19  暗い之殇  阅读(288)  评论(0编辑  收藏  举报