迷宫题解( •̀ ω •́ )y

文章讲述了如何用深度优先搜索(DFS)算法解决一个关于迷宫路径的编程问题。首先初始化矩阵并构建迷宫,然后标记起点和终点,接着定义移动方向并进行DFS搜索,遇到可行路径则递归探索,并在回溯时恢复状态。最终输出可行路径的数量。
摘要由CSDN通过智能技术生成

传送门https://www.luogu.com.cn/problem/P1605

这道题很明显是一个dfs的问题

这道题首先要在主函数里完成建造迷宫

但在建造迷宫之前,你要把所有的位置标为可以去

memset(a,'.',sizeof(a));

他给你了下标,所以你就可以直接建造迷宫,代码如下

for(int i=1;i<=T;i++){
	cin>>xx>>yy;
	a[xx][yy]='#';
}

不放心可以打一遍输出,最后要记得删掉哦( •̀ ω •́ )y

后面可以把起始点和终点在a数组中标记一下,再把起始点标1,代表来过了

a[sx][sy]='S';
a[fx][fy]='F';
vis[sx][sy]=1;

你还要第一个方向数组,让你可以上下左右的移动(改变坐标)

int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};

下面就可以进入dfs之中了

首先是dfs的出口,很简单就是下标为重点的下标即可

if(x==fx&&y==fy){
	ans++;//可行路线+1
	return ;
}

下面就改变路线(移动)

有4种方向可以走,为上,下,左,右

int nx=x+dx[i],ny=y+dy[i];

判断一下他是否可以走

if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]!='#'&&vis[nx][ny]==0)
//是不是在迷宫之中,是不是障碍,来没来过

如果是的话,就把这个位置标1,代表来过,在进入那个点看看,最后还不要忘了要回溯,因为他又回来了,也就没有走过这个点

vis[nx][ny]=1;
dfs(nx,ny);
vis[nx][ny]=0;

最后,附上完整代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,T,sx,sy,fx,fy,xx,yy,vis[10][10],ans;
char a[10][10];
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
void dfs(int x,int y){
	if(x==fx&&y==fy){
		ans++;
		return ;
	}
	for(int i=0;i<4;i++){
		int nx=x+dx[i],ny=y+dy[i];
		if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]!='#'&&vis[nx][ny]==0){
			vis[nx][ny]=1;
			dfs(nx,ny);
			vis[nx][ny]=0;
		}
	}
}
int main(){
	cin>>n>>m>>T>>sx>>sy>>fx>>fy;
	memset(a,'.',sizeof(a));
	a[sx][sy]='S';
	a[fx][fy]='F';
	vis[sx][sy]=1;
	for(int i=1;i<=T;i++){
		cin>>xx>>yy;
		a[xx][yy]='#';
	}
	dfs(sx,sy);
	cout<<ans;
	return 0;
}

禁止抄袭

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值