迷宫求解


一般路径求解:
#pragma once
#include <iostream>
#include <Windows.h>
#include <stack>
#include <assert.h>
using namespace std;

const size_t N = 15;

void InitMaze(int maze[][N], size_t n)   //写入迷宫
{
	FILE* pp = fopen("ak.txt", "r");
	assert(pp);
	for (size_t i = 0; i < n; ++i)
	{
		for (size_t j = 0; j < n;)
		{
			char ch = fgetc(pp);   //转换为二进制输出
			if (ch == '0' || ch == '1')
			{
				maze[i][j] = ch - '0';
				++j;
			}
		}
	}
}


void PrintMaze(int maze[][N], size_t n)   //打印迷宫
{
	for (size_t i = 0; i < n; ++i)
	{
		for (size_t j = 0; j < n; ++j)
		{
			cout << maze[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}


struct Pos
{
	int _row;    //行
	int _col;   //列
};


//0为通路     其他均不通
bool CheckAccess(int maze[][N], int n, Pos pos)   //检查位置是否为通路
{
	if ((pos._row < n && pos._row >= 0)
		&& (pos._col < n && pos._col >= 0)
		&& (maze[pos._row][pos._col] == 0))
	{
		return true;
	}
	return false;
}


bool GetMazePath(int maze[][N], size_t n, Pos entry)  //获取路径
{
	stack<Pos> path;
	path.push(entry);
	while (!path.empty())
	{
		Pos cur = path.top();    //当前位置压入栈顶
		//找到出口
		if (cur._row == n - 1)
		{
			return true;
		}
		Pos next = cur;
		maze[cur._row][cur._col] = 2;   //走过的路程标记为2
		//代码实现的方向次序决定执行的次序,如果在优先方向找到通路,则不会在找其他通路
		//上
		next = cur;
		next._row--;
		if (CheckAccess(maze, n, next))
		{
			path.push(next);
			continue;
		}

		//右
		next = cur;
		next._col++;
		if (CheckAccess(maze, n, next))
		{
			path.push(next);
			continue;
		}

		//下
		next = cur;
		next._row++;
		if (CheckAccess(maze, n, next))
		{
			path.push(next);
			continue;
		}



		//左
		next = cur;
		next._col--;
		if (CheckAccess(maze, n, next))
		{
			path.push(next);
			continue;
		}
		Pos top = path.top();
		maze[top._row][top._col] = 3;   //如果此时走的路不通,回溯时,走的路标记为3

		path.pop();
	}
	return false;
}





//bool GetMazePathR(int maze[][N], size_t n, Pos cur, 

//stack<Pos>& shortPath, stack<Pos>& path)
//{
//	path.push(cur);
//}


#include"maze.h"


void test()
{
	int maze[N][N];
	InitMaze(maze, N);
	PrintMaze(maze, N);
	stack<Pos> path;
	Pos entry;
	entry._row = 2;
	entry._col = 0;
	maze[2][0] = 2;
	GetMazePath(maze, N, entry);
	PrintMaze(maze, N);

}

int main()
{
	test();
	system("pause");
	return 0;
}





  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值