草庐IT

洛谷 P1605 迷宫

yczzws 2023-03-28 原文

题目背景题目链接

  题目描述

  给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。

  在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

  给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。

  输入格式

  第一行为三个正整数 N,M,T,分别表示迷宫的长宽和障碍总数。

  第二行为四个正整数 SX,SY,FX,FY,SX,SY代表起点坐标,FX,FY代表终点坐标。

  接下来 $T$ 行,每行两个正整数,表示障碍点的坐标。

  输出格式

  输出从起点坐标到终点坐标的方案总数。

  样例输入                                     样例输出

   2 2 1                                                         1
   1 1 2 2
   1 2

题解

  解题思路

    经典的DFS+回溯题目,从起点向四周递归搜索,遇到边界,障碍或走过的路就回溯一步改变方向继续搜索,统计最终到达终点的次数(几道类似的题目:P1141P1238)。详细思路见代码。

 1 #include<bits/stdc++.h>//万能头文件
 2 using namespace std;
 3 int a,b,c,d;
 4 int ans;
 5 int z[101][101];
 6 int zx,zy;
 7 int n,m,t;
 8 void dfs(int p,int q)
 9 {
10     if(p==c&&q==d)
11     {
12         ans++;
13         return;
14     }//如果到达终点,就回到上一层
15     z[p][q]=0;
16     if(z[p][q+1]!=0)
17     {
18         dfs(p,q+1);
19         z[p][q+1]=1;
20     }//如果右边可以走,就走
21     if(z[p][q-1]!=0)
22     {
23         dfs(p,q-1);
24         z[p][q-1]=1;
25     }//走左边
26     if(z[p-1][q]!=0)
27     {
28         dfs(p-1,q);
29         z[p-1][q]=1;
30     }//走上边
31     if(z[p+1][q]!=0)
32     {    
33         dfs(p+1,q);
34         z[p+1][q]=1;
35     }//走下边
36 }
37 int main()
38 {
39     memset(z,0,sizeof(z));//将z数组全部赋值为0
40     
41     cin>>n>>m>>t;//输入迷宫的长、宽以及障碍的数量
42     cin>>a>>b>>c>>d;//(a,b)为起点坐标,(c,d)为终点坐标
43     
44     for(int i=1;i<=n;i++)
45         for(int j=1;j<=m;j++)
46             z[i][j]=1;//将迷宫区域全部赋值1,代表可以走
47     for(int i=1;i<=t;i++)
48     {
49         cin>>zx>>zy;//输入障碍的坐标
50         z[zx][zy]=0;//将障碍的坐标赋值为0,代表不可以走
51     }
52     dfs(a,b);//进行深搜
53     cout<<ans<<endl;输出路的数量
54     return 0;//完结撒花
55 }//提交记录

有关洛谷 P1605 迷宫的更多相关文章

  1. 迷宫问题-DFS-BFS - 2

    迷宫问题迷宫问题简介BFS解决迷宫最短路径问题DFS记录迷宫路径DFS解决迷宫所有路径问题迷宫问题简介🚀学习过算法程序设计的应该都学习过迷宫这个问题,迷宫问题主要设计的算法就是DFS-深度优先遍历和BFS-广度优先遍历。🚀在一个二维数组中,元素为1的位置表示这个位置是墙,0表示有通路,迷宫的入口和出口都是0(否则不会有路径能出去),并且路径不唯一。例如下图:🚀图中这个迷宫有两条路径,分别用粉色和蓝色标记了出来,明显粉色路径的长度是比蓝色路径要短的。BFS解决迷宫最短路径问题🚀BFS可以解决最短路径的原因是,BFS是像水波一样逐渐向外圈波及的,很明显最先波及到的通路就是最短路径。🚀使用BFS算法

  2. 用栈求解迷宫问题的所有路径及最短路径程序(纯c语言) - 2

    参考了这个博客学校作业,在各种地方搜了半天,看别人的要么就是有点错,要么就是很复杂用了不少我不知道的库,还要么就是只求了一条路径,还要么就是用了c++没学过。写了半天,写出了一个应该是比较简单的方法,应该是还能优化,不过作业能跑就行,懒得搞了。有更好的想法,欢迎交流。----------------------------------------------------------------------------------------正文讲讲思路吧,首先定义一下迷宫的方块typedefstruct{ inti;//行intj;//列intdi;//探索方向}box;再定义一下栈typed

  3. Unity3D Maze 迷宫生成算法 - 2

    环境:Unity2021.1.14语言:C#总起本文的源代码可以在以下网址的TestMaze中找到:https://github.com/anguangzhihen/TestOdinInspector《人工智能与游戏》关于PCG文章的末尾提供了一个生成迷宫的练习:Maze,aUnityC#Tutorial该练习对Unity中使用的常规技术讲解的十分详细,很适合刚接触Unity的新手,当然本文不会对Unity过多的展开。该工程的主要代码在TestMaze中,游戏开始会启动一个协程,用于创建地板(Cell)和墙壁,我们主要聚焦的就是这生成步骤的实现。后续原文的实现中还会有装饰画、门、合并房间的内容

  4. 【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(14) - 2

    目录写在前面:题目:P1332血色先锋队-洛谷|计算机科学教育新生态(luogu.com.cn)        题目描述:        输入格式:        输出格式:        输入样例:        输出样例:解题思路:代码:AC!!!!!!!!!!写在最后:写在前面:怎么样才能学好一个算法?我个人认为,系统性的刷题尤为重要,所以,为了学好广度优先搜索,为了用好搜索应对蓝桥杯,事不宜迟,我们即刻开始刷题!题目:P1332血色先锋队-洛谷|计算机科学教育新生态(luogu.com.cn)题目描述:输入格式:第 1 行:四个整数 n,m,a,b,表示军团矩阵有 n 行 m 列。有 

  5. 洛谷——树与图dp与状压dp - 2

    文章目录[NOIP1996提高组]挖地雷题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示思路代码最大食物链计数题目背景题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示思路代码[ZJOI2006]三色二叉树题目描述输入格式输出格式样例#1样例输入#1样例输出#1思路代码跑路题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示提示数据规模与约定采蘑菇题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示有线电视网题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示思路代码邦邦的大合唱站队题目背景题目描述输入格式输出格式样例#1样例输入#1样例输出#1提

  6. 【蓝桥杯Java组】用Java带你暴走迷宫—DFS深度优先搜索 - 2

    ☕前言:📖📖走迷宫一类的问题一般都是暴力搜索解决,搜索的方法有两种:深度优先(DFS)和广度优先(BFS),而提到DFS就离不开递归,涉及到递归的问题理解起来还是有难度的,代码编写不当很容易造成栈溢出。🌻🌻今天就用三道走迷宫问题带你彻底搞懂怎么用DFS秒杀迷宫类问题~题目传送门:🚀🚀🚀三道练习题目全部来源于计蒜客平台。题目链接迷宫(一)https://nanti.jisuanke.com/t/T1595迷宫(二)http://nanti.jisuanke.com/t/T1596迷宫(三)https://nanti.jisuanke.com/t/T1597🍋走迷宫—DFS深搜:😎不废话,直接上题

  7. Python 用Ursina引擎制作一个3D迷宫游戏 - 2

    Ursina是一个3D引擎,初步使用方法,见以下文章:手把手教你用Python编一个《我的世界》1.认识Ursina并学会绘制立体图形_Leleprogrammer的博客-CSDN博客_ursinaPython有一个不错的3D引擎——UrsinaUrsina官网:www.ursinaengine.org打开cmd,控制台输入pipinstallursina以安装ursina编写第一个程序首先导入ursinafromursinaimport*然后创建appapp=Ursina()运行appapp.run()最终代码:fromursinaimport*app=Ursina()app.run()如果

  8. java - 使用堆栈遍历和解决迷宫 - Java - 2

    所以我正在尝试创建一个迷宫求解器程序来解决X和O的迷宫。我想做的是创建一个点类,这样我就可以创建一个二维点数组,它允许打印到输出页面以及相对简单地实现堆栈。我想在实际程序本身中实现的总体思路的最简单算法我认为应该是:1)Moveforward2)Areyouatawall?2a)Ifyes,turnleft3)Areyouatthefinish?3a)Ifno,goto13b)Ifyes,solved但是我在想出更深入的算法以及定位我的Points类时遇到了麻烦。我知道对于Points我应该设置X坐标,并设置Y坐标以及两者的setter/getter。你认为我需要比这两个更多的方法吗?

  9. java - 将随机迷宫生成合并到我的游戏中(Java) - 2

    我目前正在用Java制作迷宫解谜游戏,但遇到了麻烦。我能找到的所有随机迷宫生成算法都以一种我无法弄清楚如何在我当前代码中实现的方式输出。我正在考虑使用DepthFirstSearch,RecursiveBacktracker,或Prim'sAlgorithm,因为我认为它们是最容易实现的,同时还能产生好的迷宫。使用与我当前程序一起使用的那些算法之一的工作用途是什么?这是我的游戏类:(也请随时指出任何不好的做法,我是Java的新手)packagegame;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicc

  10. java - 这是什么迷宫求解算法? - 2

    我想弄清楚这个算法是A*(A星)算法还是其他什么,但我仍然很困惑。Stackstack=newStack();stack.push(maze.start());stack.peek().mark(SOLUTION_MARK);while(!stack.peek().hasMark(Cell.END)){Cellcurrent=stack.peek();ArrayListdirs=current.neighbors();booleanfound=false;for(Cellnext:dirs){if(next.hasMark(ERROR_MARK)||next.hasMark(SOLUT

随机推荐