栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【学习记录】C++迷宫问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【学习记录】C++迷宫问题

给定一个大小为NxM的迷宫。迷宫有通道和墙壁组成,每一步可以向邻接的上下左右四格通道移动。请求从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点,其中 

样例:

N=10,M=10 (‘#’,’.’,’S’,’G’分别表示墙壁、通道、起点和终点)

#S######.#

......#..#

.#.##.##.#

.#........

##.##.####

....#....#

.#######.#

....#.....

.####.###.

....#...G#

输出:

 22

提示:为便于测试和修改,迷宫数据可以采用文本文件的形式进行保存,程序运行时从文件读入。

程序代码及测试结果:

#include 
using namespace std;

char map[10][10] = {0};

int flag[10][10] = {0}; //0为未访问,1为已访问
void dfs(int x, int y, int step);
int Min = 100;

int main() {
	int M, N;
	int i, j, x, y, step = 0;
	cin >> M >> N;
	for (i = 0; i < N; i++) {
		for (j = 0; j < M; j++) {
			cin >> map[i][j];
		}
		cout << endl;
	}
	for (i = 0; i < N; i++) {
		for (j = 0; j < M; j++) {
			if (map[i][j] == 'S') {
				x = i;
				y = j;
			}
		}
	}
	flag[x][y] = 1;
	dfs(x, y, step);
	printf("%d", Min);
	return 0;
}

void dfs(int x, int y, int step) {
	if (map[x][y] == 'G') {

		if (step < Min)
			Min = step;
		return;
	}
	if (map[x - 1][y] != '#' && flag[x - 1][y] == 0 && x - 1 >= 0) {
		flag[x - 1][y] = 1;
		dfs(x - 1, y, step + 1);
		flag[x - 1][y] = 0;
	}
	if (map[x + 1][y] != '#' && flag[x + 1][y] == 0 && x + 1 <= 9) {
		flag[x + 1][y] = 1;
		dfs(x + 1, y, step + 1);
		flag[x + 1][y] = 0;
	}
	if (map[x][y - 1] != '#' && flag[x][y - 1] == 0 && y - 1 >= 0) {
		flag[x][y - 1] = 1;
		dfs(x, y - 1, step + 1);
		flag[x][y - 1] = 0;
	}
	if (map[x][y + 1] != '#' && flag[x][y + 1] == 0 && y + 1 <= 9) {
		flag[x][y + 1] = 1;
		dfs(x, y + 1, step + 1);
		flag[x][y + 1] = 0;
	}
	return;
}

2022/5/15

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886596.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号