【洛谷千题详解】P1605 迷宫

目录

题目总览

题目描述

输入格式

输出格式

输入输出样例

思路分析

AC代码


题目总览

题目描述

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

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

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

输入格式

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

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

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

输出格式

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

输入输出样例

Input 1:

cpp 复制代码
2 2 1
1 1 2 2
1 2

Output 1:

cpp 复制代码
1

思路分析

经典DFS模版题,实在做不出来就看我的DFS讲解吧。

注意以下几点:

1.记得回溯

2.读入数据的顺序别读入错误

3.只有四个方向,并非八个方向

AC代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
bool a[10][10];
bool vis[10][10]={0};
int n,m,t,sx,sy,fx,fy,ans=0,tx,ty;
int dx[4]={0,0,1,-1};
int dy[4]={-1,1,0,0};
void dfs(int x,int y)
{
	if(x==fx&&y==fy)
	{
		ans++;
		return;
	}
	vis[x][y]=true;
	for(int i=0;i<=3;i++)
	{
	    int nx=x+dx[i];
	    int ny=y+dy[i];
	   	if(!vis[nx][ny]&&a[nx][ny]&&x>=1&&y>=1&&x<=n&&y<=m)	
        {
	         dfs(nx,ny);	
	    }
	}
	vis[x][y]=false; 
}
int main()
{
	cin>>n>>m>>t>>sx>>sy>>fx>>fy;
	for(int i=1;i<=n;i++)
	{
	    for(int j=1;j<=m;j++)
	    {
	        a[i][j]=true;
	    }
	}
	for(int i=1;i<=t;i++)
	{
		cin>>tx>>ty;
		a[tx][ty]=false;
	}
	vis[sx][sy]=true;//起点为真
	dfs(sx,sy);
	cout<<ans<<endl;
	return 0;
}
相关推荐
FakeOccupational6 小时前
【数学 密码学】量子通信:光的偏振&极化的量子不确定性特性 + 量子密钥分发 BB84算法步骤
算法·密码学
ZhengEnCi8 小时前
S10-蓝桥杯 17822 乐乐的积木塔
算法
贾斯汀玛尔斯8 小时前
每天学一个算法--拓扑排序(Topological Sort)
算法·深度优先
大龄程序员狗哥8 小时前
第25篇:Q-Learning算法解析——强化学习中的经典“价值”学习(原理解析)
人工智能·学习·算法
exp_add38 小时前
质数相关知识
算法
小辉同志9 小时前
215. 数组中的第K个最大元素
数据结构·算法·leetcode··快速选择
小O的算法实验室10 小时前
2025年IEEE TITS,基于矩阵的进化计算+面向无线传感器网络数据收集无人机路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
OidEncoder10 小时前
编码器分辨率与机械精度的关系
人工智能·算法·机器人·自动化
memcpy010 小时前
LeetCode 2615. 等值距离和【相同元素分组+前缀和;考虑距离和的增量】中等
算法·leetcode·职场和发展
炽烈小老头10 小时前
【 每天学习一点算法 2026/04/22】四数相加 II
学习·算法