1276. 【搜索与回溯算法】迷宫

news/2025/2/8 21:17:08 标签: 算法, c++, 深度优先
题目描述

给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问每个方格最多经过1次,在迷宫中移动有上下左右四种方式。保证起点上没有障碍。问:有多少种从起点坐标到终点坐标的方案?

输入

第一行N、M和T,N为行,M为列,T为障碍总数。
第二行起点坐标SX,SY,终点坐标FX,FY。
接下来T行,每行为障碍的坐标。

输出

给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。

样例输入
2 2 1
1 1 2 2
1 2
样例输出
1
数据范围限制

对于 50% 的数据,1<=N,M<=3;
对于 100% 的数据,1<=N,M<=5。

代码:

        V1.0的代码(70分):
#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<b;i++)
using namespace std;
int c_map[55][55],n,m,tot;
int Map[55][55];
int dx[] = {1,0,-1,0};
int dy[] = {0,-1,0,1};
void dfs(int x,int y,int lx,int ly)
{
	if(x==lx&&y==ly)
	{
		tot++;
		return ;
	}
	for(int i=0;i<4;i++)
	{
		int tx=dx[i]+x;
		int ty=dy[i]+y;
		if(tx>=0&&ty>=0&&tx<n&&ty<m&&c_map[tx][ty]==0&&Map[tx][ty]==0)
		{
			c_map[tx][ty] = 1;
			dfs(tx,ty,lx,ly);
			c_map[tx][ty] = 0;
		}
	}
}
int main()
{
	int sx,sy,lx,ly,t;
	cin >> n >> m >> t;
	cin >> sx >> sy >> lx >> ly;
	_for(i,0,t)
	{
		int x,y;
		cin >> x >> y;
		Map[x-1][y-1] = 1;
	}
	dfs(sx-1,sy-1,lx-1,ly-1);
	cout<<tot;
	return 0;
}
        代码错误的测试点:

        Input:        

4 4 0
3 3 3 4

        Output:

86

        但是我输出的是305

V2.0的代码:
#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<b;i++)
using namespace std;
int c_map[55][55],n,m,tot;
int Map[55][55];
int dx[] = {1,0,-1,0};
int dy[] = {0,-1,0,1};
void dfs(int x,int y,int lx,int ly)
{
	if(x==lx&&y==ly)
	{
		tot++;
		return ;
	}
	for(int i=0;i<4;i++)
	{
		int tx=dx[i]+x;
		int ty=dy[i]+y;
		if(tx>=0&&ty>=0&&tx<n&&ty<m&&c_map[tx][ty]==0&&Map[tx][ty]==0)
		{
			c_map[tx][ty] = 1;
			dfs(tx,ty,lx,ly);
			c_map[tx][ty] = 0;
		}
	}
}
int main()
{
	int sx,sy,lx,ly,t;
	cin >> n >> m >> t;
	cin >> sx >> sy >> lx >> ly;
	_for(i,0,t)
	{
		int x,y;
		cin >> x >> y;
		Map[x-1][y-1] = 1;
	}
	c_map[sx-1][sy-1] = 1;
	dfs(sx-1,sy-1,lx-1,ly-1);
	cout<<tot;
	return 0;
}

PS:

        所以大家一定要注意!dfs走迷宫的时候一定要标记开始位置,不然错在哪里都不知道!


http://www.niftyadmin.cn/n/5845296.html

相关文章

Class加载流程和运行时区域

目录 jvm是什么.class加载过程干预.class.class文件内容1 加载2-1 连接&#xff1a;验证&#xff08;class字节流的校验&#xff09;2-2 连接&#xff1a;准备&#xff08;分配内存&#xff0c;初始化默认值&#xff09;2-3 连接&#xff1a;解析3 class 初始化什么时候需要对类…

探索元宇宙:Facebook 如何重塑社交生态

随着虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术的飞速发展&#xff0c;我们的社交方式正在经历一场革命。Facebook&#xff08;现更名为 Meta&#xff09;在这一领域的探索尤为引人注目&#xff0c;其提出的“元宇宙&#xff08;Metaverse&a…

Java高频面试之SE-19

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; 什么是序列化&#xff1f;什么是反序列化&#xff1f; 序列化&#xff08;Serialization&#xff09; 定义&#xff1a; 序列化是将对象的状…

【LeetCode】day15 142.环形链表II

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则…

还搞不透stm32单片机启动过程?一篇文章几百字让你彻底看懂!

1.stm32启动 1.1 msp和pc的初始值&#xff0c;第一步&#xff1a; 2.boot的值就被锁定了 可以根据实际绑定的值变动&#xff0c; 这里补充一点boot1和0的原理&#xff1a; 1.2来点刺激的&#xff1a; 这里我插入一个链接&#xff1a; 【明解STM32】一文搞明白STM32芯片存储…

2025年Android NDK超全版本下载地址

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波&#xff0c;现在&#xff0c;我们尝试的想要捕获我们的PWM波&#xff0c;测量它的频率&#xff0c;我们应该怎么做呢&#xff1f;答案还是回到我们的定时器上。 我们知道&#xff0c;定时器是一个高级的秒表&#xff08;参考笔者的比喻&a…

【Linux网络编程】谈谈网络编程中的select、poll、epoll、Reactor、Proactor模型(下)

本文目录 一、IO多路复用第二版&#xff08;epoll&#xff09;二、epoll三大核心接口1、epoll_create()2、epoll_ctl()3、epoll_wait()4、epoll简单实例5、epoll的ET模式和LT模式6、epoll内核实现 三、异步IO四、Linux惊群效应与c10K问题五、主流网络模型介绍1、基于Thread-bas…