搜索算法之迷宫问题

2023-05-16

迷宫问题

Description

  给定一个n×m方格的迷宫,迷宫里有t处障碍,障碍处不可通过。给定起点坐标和终点坐标,问每个方格最多经过1次,在迷宫中移动有上下左右四种方式,保证起点上没有障碍。问:
  ① 有多少种从起点坐标到终点坐标的方案?
  ② 从起点到终点的最短路径长度是多少?输出一条长度最短的路径经过的点的坐标,若不

存在起点到终点的路径,则输出-1.

Input

第一行n、m和t,其中:n为行数,m为列数,t为障碍数。
第二行起点坐标sx、sy,终点坐标ex、ey。
接下来t行,每行为障碍的坐标。

Output

第一行从起点坐标到终点坐标的方案总数。
若存在解答,则第二行输出最短路径的长度len(起点和终点也算在步数内),以下len行,每行输出经过点的坐标(i, j);
否则无解时输出-1

Sample Input

4 5 4
0 0 3 4
0 2
1 1
2 3
3 1

Sample Output

3
8
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(3, 2)
(3, 3)
(3, 4)

analysis

  使用深搜和广搜

Source Code

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 150
int map[MAX][MAX],book[MAX][MAX],path[MAX][2];  //地图和标记 
int n,m,t,sx,sy,ex,ey;              //行、列、障碍数、起点坐标、终点坐标 
int num=0;                          //方案总数 
int dir[4][2]={
    {0, 1},                         //右 
    {1, 0},                         //下 
    {0,-1},                         //左 
    {-1,0},                         //上 
};
struct Node{                        //队列 
    int x;
    int y;
    int len;
    int f;
}Queue[MAX];
int head,tail;                      //队列的头尾指针 

int go(int x, int y)
{
    if (x<0 || x>=n || y<0 || y>=m)
        return 0;
    else 
        return 1;
}
void dfs(int x, int y)
{
    int nx,ny;
    if (x==ex && y==ey)
    {
        num++;return ;
    }
    for (int k=0; k<4; k++)
    {
        nx=x+dir[k][0]; ny=y+dir[k][1];
        if (go(nx, ny)==1 && map[nx][ny]==0 &&book[nx][ny]==0)
        {
            book[nx][ny]=1;
            dfs(nx, ny);
            book[nx][ny]=0;
        }
    }
    return ;
}
void bfs(int x, int y)
{
    int nx,ny;
    for (int k=0; k<4; k++)
    {
        nx=x+dir[k][0]; ny=y+dir[k][1];
        if (go(nx, ny)==1 && map[nx][ny]==0 &&book[nx][ny]==0)
        {
            Queue[tail].x=nx;
            Queue[tail].y=ny;
            Queue[tail].len=Queue[head].len+1;
            Queue[tail].f=head;
            tail++;
            book[nx][ny]=1;
            if (nx==ex && ny==ey)
                return ;
        }
    }
    head++;
    bfs(Queue[head].x, Queue[head].y);

}
int main()
{
    int tx,ty,t;                    //用于临时存储坐标 
    int i,j;
    int len;
    memset(book, 0, sizeof(book));
    memset(path, 0, sizeof(path));
    //freopen("test.in","r",stdin);
    scanf("%d %d %d", &n, &m, &t);
    scanf("%d %d %d %d", &sx, &sy, &ex, &ey);
    for (i=0; i<t; i++)
    {
        scanf("%d %d", &tx, &ty);
        map[tx][ty]=1;  
    }
    book[sx][sy]=1;
    dfs(sx, sy);

    memset(book, 0, sizeof(book));      //初始化标记和头尾指针 
    head=tail=0;
    Queue[tail].x=sx;
    Queue[tail].y=sy;
    Queue[tail].len=1;
    Queue[tail].f=0;
    tail++;
    printf("%d\n", num);
    bfs(sx, sy);
    len=Queue[--tail].len;
    printf("%d\n", len);
    i=tail;
    j=len-1;
    path[j][0]=ex;path[j][1]=ey;
    j--;
    while (i>1)
    {
        t=Queue[tail].f;
        path[j][0]=Queue[t].x;
        path[j][1]=Queue[t].y;
        tail=t;
        i--;j--;
    }
    for (j=0; j<len; j++)
        printf("(%d,%d)\n", path[j][0], path[j][1]);
    //fclose(stdin);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

搜索算法之迷宫问题 的相关文章

随机推荐

  • Fedora或CentOS运行dnf update报错

    今天我照常打开电脑 xff0c 随手运行了一句sudo dnf update xff0c 然后屏幕输出了一堆错误信息 xff0c 我挨个删除仓库 xff0c 最后事情越搞越乱 xff0c 只好把除了NVIDIA以外的更新源全删了 这下芭比Q
  • 高通410的随身WiFi刷完Debian在刷回安卓的教程

    看到有些朋友刷了debian不知道如何回安卓 xff0c 我这里发一个debian回安卓的教程 首先 xff0c 你需要有一份安卓的备份文件 xff0c 这里我先教大家如何备份安卓的全包 xff08 这里发的是安卓的教程 xff0c 如果没
  • 使用python 自动给微信好友发送消息 pyautogui库下载

    使用Python pyautogui xff0c 实现全自动微信发消息 xff0c 带交互功能 直接输入好友的备注 想发送的次数以及发送的内容 xff0c 即可实现自动查找该好友并对该好友发送指定的消息 先直接上代码 xff0c 后文会给出
  • js实现自动复制 弹框自动消失功能

    有个需求 xff0c 下拉框选中后自动获取下拉框内的值 xff0c 即自动复制功能 所以会用到document execCommand 34 Copy 34 这个功能 xff0c 但是需要先执行select xff0c 才能copy xff
  • centOS6.5 安装mysql5.7最新版流程

    1检查是否已经安装mysql 指令 xff1a rpm qa grep MySQL rpm qa grep mysql root 64 mysql2 rpm qa grep MySQL MySQL python 1 2 3 0 3 c1 1
  • Linux常用的基本命令

    这些Linux命令非常的好用 xff0c 也很常用 xff0c 希望大家能够将其保存 1 显示系统日期的指令 xff1a date 时间格式 xff0c 如果出现了空格需要用 单引号 39 39 如下 xff1a 时间格式为 xff1a d
  • Ubuntu 安装和使用 jupyter 出现的问题总结

    1 在终端中输入 sudo pip3 install jupyter 出现黄色的 warring 39 如下 xff1a The directory 39 home stone cache pip http 39 or its parent
  • GitLab 社区版安装与汉化方法

    1 GitLab 安装 1 1 安装并配置必要的依赖关系 在 CentOS 系统上 xff0c 下面的命令将会打开系统防火墙 HTTP 和 SSH 的访问 yum install span class hljs attribute y sp
  • 基于opencascade+qt开发简易的加工刀具轨迹

    基于opencascade 43 qt开发简易的加工刀具轨迹 借鉴基于opencascade开发的开源CAD CAM CAE软件FreeCAD HeeksCAM等尝试生成三轴零件的加工刀具轨迹 偏置刀具轨迹生成 xff1a zigzag刀具
  • 解决客户端和服务器不支持一般SSL协议版本或加密套件问题

    错误信息 详细报错信息如下图 错误原因 这种错误通常表示客户端和服务器之间存在协议版本或加密套件不匹配的情况 在SSL xff08 Secure Socket Layer xff09 连接过程中 xff0c 客户端和服务器需要协商一种相同的
  • manjaro VNC Viewer报错:vncviewer: error while loading shared libraries: libcrypt.so.1

    想在 manjaro 装 VNC Viewer 连实验室的 windows 主机 windows 机装 VNC Server xff0c manjaro 装 VNC Viewer 安装过程参考 1 xff0c 就下载 解压 运行里面的 vn
  • taokeeper 架设与部署

    相关下载 xff1a taokeeper sql http down 51cto com data 718756 taokeeper monitor config properties http down 51cto com data 71
  • 密钥“externalConsole”已弃用。请改用“console”。

    参考 xff1a 密钥externalConsole已弃用 请改用 console 我该怎么处理 编程语言 CSDN问答 感谢大佬jsfnzyj 解决方法 xff1a 将launch json里的cppvsdbg中原来的 34 extern
  • virtualbox 5.2.0 ,debian9 安装超详细过程,看一次就懂

    实验环境 xff1a 虚拟机 xff1a virtualbox version 5 2 0 r118431 QT5 6 2 镜像文件 xff1a debian 9 2 1 amd64 DVD 1 iso gt 选择这个完整镜像的原因是因为可
  • you-get库——python详解

    目录 part1 xff1a you get安装 part2 xff1a 使用you get part1 xff1a you get安装 输入 xff1a pip3 install you get 只基于python3 X 安装图如下 xf
  • 结构体数组的用法小结

    原文章链接 xff08 写的相当详细 xff09 http span class token operator span span class token operator span span class token operator sp
  • C++ 快读两种方法

    法一 T宝法 xff1a ios span class token double colon punctuation span span class token function sync with stdio span span clas
  • python小程序之七段数码管的绘制

    今天我们学习了七段数码管的绘制 xff0c 通过一个程序学习了数字用七段数码的绘制 首先我们看下图的绘制 xff0c 我们先理解下各个数字由几步线条组成 然后回到我们的程序 xff0c 先给大家看看我们的程序图 xff0c 因为小编录屏很模
  • 深入理解并查集(Disjoint Set Union),并利用其解决相关问题

    一 什么是并查集 xff1f 首先字面意思是把相互联系的元素通过特定查询组成一个集合 规范化解释 xff1a 并查集 xff0c 在一些有N个元素的集合应用问题中 xff0c 我们通常是在开始时让每个元素构成一个单元素的集合 xff0c 然
  • 搜索算法之迷宫问题

    迷宫问题 Description 给定一个n m方格的迷宫 xff0c 迷宫里有t处障碍 xff0c 障碍处不可通过 给定起点坐标和终点坐标 xff0c 问每个方格最多经过1次 xff0c 在迷宫中移动有上下左右四种方式 xff0c 保证起