亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

應用棧求解迷宮問題(C++實現)

發布時間:2020-07-14 00:59:59 來源:網絡 閱讀:1776 作者:檸公子 欄目:編程語言

棧是數據結構中一種重要的線性結構,限定僅在表尾進行插入和刪除操作的線性表,因此我們也可以認為它是一種特殊的線性表。由于棧的這個特點,我們又可以稱其為后進先出的結構。如圖所示:

應用棧求解迷宮問題(C++實現)

       由于棧具有后進先出的性質我們可以利用,是程序設計中一個有用的工具。利用棧我們可以來實現數制轉換、后綴表達式求值、迷宮求解等等。在書本上我們可以看到用C語言實現的簡單思路,但是程序仍舊存在許多bug。今天,我想嘗試用強大的C++來實現。

      迷宮問題的求解思路大致則是從入口出發,順著某一方向向前探索,若能走通,則繼續向前探索;若不能走通,則換一方向進行探索,直至所有可能的通路都探索完為止。利用棧的特性,我們可以將探索過可通的路依次進棧,如果遇到不通的路則進行出棧操作,進行回退,重復探索。

       ps:為了方便起見我利用了一個記事本來存放迷宮,用1表示不通,0表示通路。將走過的路程標注為2.

代碼實現:

struct Pos	 //可通過下標訪問位置
{
	int _ROW;
	int _COL;
};

void GetMaze(int *a,int n)	//從文件中讀出迷宮地圖
{
	FILE* fout=fopen("Maze.txt","r");
	assert(fout);
	for(int i=0; i<n; i++)
	{
		for(int j=0; j<n; 
			)
		{
			char ch=fgetc(fout);
			if(ch=='0' || ch=='1')
			{
				a[i*n+j]=ch-'0';
				++j;
			}
			else
			{
				   continue;
			}
		}
	}
	fclose(fout);
}

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,Pos& entry,stack<Pos>& path)	   //探索過程
{
	Pos cur=entry;
	path.push(cur);
	while(!path.empty())
	{
		Pos next=cur;
		a[cur._ROW*n+cur._COL]=2;
		
		if(next._ROW==n-1) /*|| next._ROW==0 || next._COL==n-1 ||  next._COL==0*/
		{
			return true;
		}
		//判斷上下左右是否為通路 
		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();
		
	}					   
}



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;
	}	
}





向AI問一下細節

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

AI

明水县| 泽库县| 晴隆县| 顺平县| 错那县| 绥宁县| 漳州市| 剑川县| 洪湖市| 山东| 长泰县| 牟定县| 衡水市| 灵璧县| 宜昌市| 石阡县| 棋牌| 海淀区| 苏尼特左旗| 金堂县| 新宁县| 高唐县| 启东市| 当涂县| 博野县| 宕昌县| 江津市| 沂水县| 开原市| 开远市| 平原县| 平利县| 桦南县| 永登县| 郁南县| 二手房| 五莲县| 石河子市| 高安市| 贡山| 句容市|