算法笔记 codeup【递归入门】走迷宫

本文介绍了一种使用递归搜索解决迷宫寻路问题的算法。通过定义迷宫的结构和状态,利用递归的方式寻找从起点到终点的所有可能路径,并统计路径数量。算法首先检查当前位置是否为终点,如果是,则输出路径并计数;如果不是,则尝试向四个方向移动,避免重复访问同一位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【递归入门】走迷宫

题目链接:http://codeup.cn/problem.php?cid=100000608&pid=5

思路
代码
#include <iostream>
#include <algorithm>
using namespace std;

int cnt = 0; // 记录迷宫能走通的方法数,如果0,输出-1
int n,m;
const int maxn = 225;  // 15*15=225
bool used[maxn][maxn] = {false};    // used[i][j] 若是i,j走过就将其变为true
int migong[maxn][maxn];

struct Node {
	int x;
	int y;
};

Node st,ed;
int x[4] = {0,-1,0,1};
int y[4] = {-1,0,1,0};
Node way[maxn];  // 走过的路
int wayi = 0;

void mysearch(Node node) {

	if (node.x == ed.x&&node.y==ed.y) {
		for (int i = 0 ; i < wayi; i++) {
			printf("(%d,%d)",way[i].x,way[i].y);
			if (i<wayi-1)
				printf("->");
			else
				printf("\n");
		}
		cnt++;
		return;
	}


	for (int i = 0 ; i < 4 ; i++) {
		Node newNode;
		newNode.x = node.x + x[i];
		newNode.y = node.y + y[i];
		if (newNode.x>=1&&newNode.x<=n&&newNode.y>=1&&newNode.y<=m) {  // 没有越界
			if (used[newNode.x][newNode.y]==false&&migong[newNode.x][newNode.y]==1) {  // 没有走过 且迷宫1可走
				used[newNode.x][newNode.y]=true;
				way[wayi++] = newNode;
				mysearch(newNode);
				used[newNode.x][newNode.y]=false;
				wayi--;
			}
		}
	}



}


int cntX[maxn] = {0};
int ansX=0;

int cntY[maxn] = {0};
int ansY=0;
int main() {
	scanf("%d%d",&n,&m);



	for (int i = 1; i <=n; i++)
		for (int j = 1; j <=m; j++) {
			scanf("%d",&migong[i][j]);
			if (migong[i][j]==0) {
				cntX[i]++;  // 记录第i行的0个数i从1开始
				if (cntX[i]==m) {
					ansX = i;   // ansX为某一行全为0的行号
				}
			}
		}

	for (int j = 1; j <=m; j++)
		for (int i = 1; i <=n; i++) {

			if (migong[i][j]==0) {
				cntY[j]++;  // 记录第j列的0个数j从1开始
				if (cntY[j]==n) {
					ansY = j;   // ansY为某一列全为0的列号
				}
			}
		}
	scanf("%d%d%d%d",&st.x,&st.y,&ed.x,&ed.y);


// 下面两个判断做的不好,若是全0的列或者行不止一个,这样得到的是最后的列和行号
	if ((ansX>st.x&&ansX<ed.x)||(ansX<st.x&&ansX>ed.x)) {
		printf("-1");
		return 0;
	}
	if ((ansY>st.y&&ansY<ed.y)||(ansY<st.y&&ansY>ed.y)) {
		printf("-1");
		return 0;
	}




	used[st.x][st.y] = true;
	way[wayi++] = st;

	mysearch(st);

	if (cnt==0)
		printf("-1");

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值