• luogu P1238 走迷宫--DFS模板好(水)题


    题目描述

    有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-l表示无路)。

    优先顺序:左上右下

    输入输出格式

    输入格式:

    第一行是两个数m,n(1<m,n<15),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。

     

    输出格式:

    所有可行的路径,描述一个点时用(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,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)

    对于已经学习过搜索的人来说比较简单吧,有一点小问题就是输出每一步的位置。
      简单,用个包含俩int变量的结构体完全可以搞定,成立就输出,不成立的话return;
    DFS板子:
    #include<bits/stdc++.h>
    using namespace std;
    int dx[5]={0,-1,0,1};
    int dy[5]={-1,0,1,0};
    struct haha{
        int x,y;
    }road[1000];
    int vis[1000][1000];
    int m,n,a[30][30],qix,qiy,zx,zy,k;
    void dfs(int x,int y,int bu){
        if(x==zx&&y==zy){
            k=1;
            printf("(%d,%d)",qix,qiy);
            for(int i=1;i<bu;i++){
                printf("->(%d,%d)",road[i].x,road[i].y);            
            }
            cout<<"
    ";
            return ;
        }
        for(int i=0;i<4;i++){
            int cur=x+dx[i];
            int str=y+dy[i];
            if(cur>=1&&cur<=m&&a[cur][str]==1&&str>=1&&str<=n&&!vis[cur][str]){
                vis[cur][str]=1;
                road[bu].x=x+dx[i];
                road[bu].y=y+dy[i];
                dfs(road[bu].x,road[bu].y,bu+1);
                road[bu].x-=dx[i];
                road[bu].y-=dy[i];
                vis[cur][str]=0;
            }
        }
    }
    int main()
    {
        cin>>m>>n;
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                cin>>a[i][j];
            }
        }
        cin>>qix>>qiy>>zx>>zy;
        vis[qix][qiy]=1;
        dfs(qix,qiy,1);
        if(k==0)cout<<"-1";
    }
  • 相关阅读:
    [原创]全新IFPGA-Cable----支持Xilinx/Altera/Lattice JTAG和UART
    [原创]Modelsim后仿真
    [原创]iFPGA-USB2.0 FT2232H USB & UART开发板使用说明
    [原创]X-HDL 4.2安装与使用
    [原创][Synth 8-2543] port connections cannot be mixed ordered and named ["*_Top.v":1151]
    [原创]..OBJgpio.axf: error: L6002U: Could not open file ..objgpio.o: No such file
    [原创]Zynq SDIO WIFI SotfAP调试
    [原创]时序图新画法
    [原创]基于Zynq SDIO WIFI 2.4G/5G SotfAP STA
    [原创]Zynq AXI-CDMA的使用
  • 原文地址:https://www.cnblogs.com/rmy020718/p/8835498.html
Copyright © 2020-2023  润新知