91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

棧求解迷宮問題

發布時間:2020-07-12 08:11:39 來源:網絡 閱讀:904 作者:賈珍珍 欄目:編程語言

    求迷宮從入口到出口的所有路徑是一個經典的程序設計問題。一般的設計思想就是從入口出發,順著某個方向向下探索,探索分為上下左右四個方位,哪個方向是通的就將向下走,如果每個方向都走不下去就進行原路“回退”。所以需要一個后進先出的結構來保存從入口到出口的路徑。所以運用棧來實現是非常方便的,沿著某個方向走,將每個可通的位置進行入棧標記,再切換到下個位置;如果都不通,則棧頂出棧取消標記,再尋找。下來呢就實現一個簡單的迷宮求解問題(求解出一條通路就好),至于求解多條通路并且求出最短路徑的問題呢我還在進一步的學習中。

    在給出代碼之前先來看一下如何動態開辟一個二維數組?

int *a = new int[N*N];
int** a=new int*[N];
//a[i][j] 等價于 a[i*N + j];

    好了,現在來看迷宮的具體實現:

#define _CRT_SECURE_NO_WARNING
#pragma once
#include<iostream>
#include<stack>
#include<assert>
using namespace std;
#define N 10
struct Pos
{
	Pos(size_t row, size_t col)
		:_row(row)
		, _col(col)
	{}
	int _row;
	int _col;
};
void GetMaze(int *a,int n)//讀入文件
{
	FILE* fout = fopen("MazeMap.txt", "r");
	assert(fout);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n;)
		{
			char ch = fgetc(fout);
			if ('0' == ch || '1' == ch)
			{
				a[i*n + j] = ch - '0';
				j++;
			}
			else
			{
				continue;
			}
		}
	}
	fclose(fout);
}
void PrintMaze(int* a,int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << a[i*n + j]<<" ";
		}
		cout << endl;
	}
}
bool CheckIsAccess(int* a, int n, Pos next)
{
	assert(a);
	if ((next._row >= 0) && (next._row < n) && (next._col >= 0) && (next._col < n)&&(a[next._row*n+next._col]==0))
	{
		return true;
	}
	else
	{
		return false;
	}
}
bool MazePath(int* a, int n, const Pos& entry, stack<Pos>& path)
{
	Pos cur = entry;//入口位置
	path.push(cur);
	while (!path.empty())
	{
		//是否已經到出口
		if (cur._row == n - 1)
		{
			a[cur._row*n + cur._col] = 2;
			return true;
		}
		a[cur._row*n + cur._col] = 2;

		//*****************************************上
		Pos next = cur;
		next._row--;
		if (CheckIsAccess(a, n, next))
		{
			cur = next;
			path.push(cur);
			continue;
		}

		//*****************************************下
		next = cur;
		next._row++;
		if (CheckIsAccess(a, n, next))
		{
			cur = next;
			path.push(cur);
			continue;
		}

		//*****************************************左
		next = cur;//左
		next._col--;
		if (CheckIsAccess(a, n, next))
		{
			cur = next;
			path.push(cur);
			continue;
		}

		//*****************************************右
		next = cur;
		next._col++;
		if (CheckIsAccess(a, n, next))
		{
			cur = next;
			path.push(cur);
			continue;
		}
		cur = path.top();//到這說明沒有通路,所以棧頂出棧
		path.pop();
	}
	return false;
}
void TestMaze()
{
	int a[N][N] = {};
	GetMaze((int *)a,N);
	PrintMaze((int *)a, N);
	stack<Pos> path;
	Pos entry = { 2, 0 };
	bool ret = MazePath((int *)a, N, entry, path);
	cout << "是否有通路?" << ret << endl;
	PrintMaze((int *)a, N);
}

棧求解迷宮問題

當迷宮有多個出口時,利用全局棧可以求得最短路徑。這個我們下次再議棧求解迷宮問題

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣恩县| 恩平市| 嘉荫县| 千阳县| 湖南省| 贺州市| 东兴市| 吉林市| 修文县| 台山市| 林西县| 陆丰市| 深州市| 新乡市| 高阳县| 莆田市| 壤塘县| 乌兰县| 延寿县| 长葛市| 从化市| 华池县| 商南县| 天峻县| 禄丰县| 宜君县| 岳阳市| 崇州市| 恩平市| 阿拉善右旗| 沁阳市| 陆丰市| 金湖县| 达拉特旗| 元阳县| 琼结县| 伊宁市| 阿拉尔市| 建阳市| 饶阳县| 洪泽县|