算法导论 · 减治法 · 迷宫问题

  • 算法说明
    迷宫问题可以用深度或者是广度搜索来实现走出迷宫,这里使用dfs,同时找出所有可能的路线。
  • 源代码
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;

struct node {
	int x, y;
	node(int xx, int yy) {
		x = xx;
		y = yy;
	}
};
#define maxn 1000 + 1
int G[maxn][maxn], dis[maxn][maxn];
int n, x[4] = {0, 1, -1, 0}, y[4] = {-1, 0, 0, 1}, num = 1; 
vector<node> vt;
void dfs(int p, int q) {
//	printf("%d %d\n", p, q); 
	dis[p][q] = 0; //标记该点
	vt.push_back(node(p, q));
	if(p == n - 1 && q == n - 1) {
		for(int i = 0; i < vt.size(); i++) {
			printf("(%d, %d) ", vt[i].x, vt[i].y);
		}
		printf("成功走出迷宫%d\n", num++);
		return; 
	} 
	for(int i = 0; i < 4; i++) {
		int newp = p + x[i];
		int newq = q + y[i];
		if(newp >= 0 && newp <= n - 1 && newq >= 0 && newq <= n - 1) { //防止走出边界 
			if(dis[newp][newq] != 0 && G[newp][newq] == 0) { //没有被访问
				dfs(newp, newq);
				dis[newp][newq] = -1; //下一次搜索结束将上一个点标记取消
				vt.pop_back();
			}
		}
	}
}
int main() {
	freopen("迷宫.txt", "r", stdin);
	memset(dis, -1, sizeof(dis)); //初始化都没有访问过
	scanf("%d", &n);
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < n; j++) {
			scanf("%d", &G[i][j]);
		}
	}
	dfs(0, 0);
	return 0;
}
  • 输入数据
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
发布了77 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/y_dd6011/article/details/97431044