財神娛樂首存即享優惠回饋唷~詳情請進👉

【數據布局】10分鐘教你用棧求解迷宮老電子老虎機遊戲鼠成績超具體教程附C++源

成績描寫

給定一張迷宮輿圖以及一個迷宮進口,然落后入迷宮索求找到一個出口。以下圖所示:

該圖妞妞運氣是一個矩形地區,有一個進口以及出口。迷宮外部包括不克不及穿梭的墻壁或者者停滯物。這些停滯物沿著行以及列放置,與迷宮的界限平行。迷宮的進口在左上角,出口在右下角。

成績闡發

  1. 起首要有一張迷宮輿圖,輿圖由兩部門構成:

    (1)一是迷宮中遍地的地位坐標,

    (2)二是迷宮列位置處的狀況信息,即該處是墻仍是路

以是,該迷宮輿圖可由一個二維數組來透露表現。數組的橫縱坐標透露表現迷宮遍地的地位坐標,數組元素透露表現列位置處的狀況信息。

2.在這里,假設:

(1)迷宮輿圖是m*n的,即二維數組是m行n列的。
(2)在迷宮頂用1透露表現墻,用0透露表現路。當然,為了便于標識,咱們前面還會用其余數字代表更多寄義。

是以,迷宮的輿圖一個描畫以下:

目前咱們要找一條從進口到出口的路徑。路徑是一個由地位構成的序列,每一個地位都沒有停滯,而且除進口外,路徑上的每一個地位都是前一個地位在器材南北偏向上相鄰的一個地位。

無非,思量到界限成績不太利益理。咱們做如許的事情,在輿圖外圍加一層圍墻,給它掃數填上1。如許,在處置各個坐標時,都沒有差別了。如許一來便大大簡化了咱們的事情。

上面咱們要編寫法式求解這個成績。

法式設計

此次仍是采取一個簡略的模塊化來設計這個法式。那末首要有上面幾個模塊:

  1. 顯示迎接信息
  2. 初始化事情
  3. 天生輿圖
  4. 找路
  5. 打印輿圖以及路徑

上面咱們分手實現這些功效。

顯示迎接信息

這個模塊就很簡略了,輸入一些信息提示使用者就行,首要是為了增長法式的友愛性而配置的。人人依據本人的必要自行施展。例如我的就很隨意了:

1void?welcome()
2{
3????cout?<<?"大眾welcome?to?RAT?IN?MAZE"大眾?<<?endl;
4????system(公眾pause"大眾);
5????system("大眾cls公眾);
6}

初始化事情

這個首要是配置一些全局變量的取值以及實現內存的調配,輿圖的存儲仍是從堆上調配內存比較好。由于一般來說,思量到輿圖可能會很大,如許必要六合彩開獎日期2020的存儲空間就許多了。在這里一并把相關的全局變量給講授了吧。

 1typedef?struct??
2{
3????int?row;
4????int?col;
5}POSITION;
6
7
8const?POSITION?maze_size?=?{?20?,?60?};
9
10int?**?const?maze?=?new?int*[maze_size.row?+?2];
11
12stack<POSITION>?path;
13POSITION?offset[4];//direction
  • POSITION布局體
    坐標布局體變量類型,很輕易懂得,有兩個成員變量:x坐標以及y坐標。

  • maze_size
    界說輿圖的巨細,現實調配內存的時辰,咱們還必要思量輿圖界限也必要存儲空間。總之,咱們的輿圖坐標規模是1 to maze_size。

  • maze
    二位數組,存儲輿圖,調配的時辰+2是用來存儲界限的。至于const則是約束指針不改變。無非咱們的輿圖數組是依據maze_size巨細靜態調配的。

  • path
    用來存路徑的。

  • offset
    用來配置地位偏移的。譬如咱們當前地位是(row = 1,col = 1),那末經由過程row + 1便可去下走,row – 1便是去上走。col + 1去右走,col – 1 去左走。等等。經由過程坐標加減offset偏移,便可以挪移了。

 1void?init()
2{
3????//偏移
4????offset[0].row?=?0;?offset[0].col?=?1;?//right
5????offset[1].row?=?1;?offset[1].col?=?0;?//down
6????offset[2].row?=?0;?offset[2].col?=?-1;?//left
7????offset[3].row?=?-1;?offset[3].col?=?0;?//up
8
9????//maze?=?new?int*[maze_size.row?+?2];
10????for?(int?i?=?0;?i?<?maze_size.row?+?2;?i++)
11????{
12????????maze[i]?=?new?int[maze_size.col?+?2];
13????}
14}

這個代碼便是配置偏移的數值,和靜態調配輿圖數組了。

天生輿圖

天生輿圖仍是依據輿圖尺寸,然后隨機配置停滯。無非要注重停滯浮現的幾率配置得小一點,否則輿圖一般無解。可以用rand()隨機數來做。這一步也要把圍墻配置好。

 1//輿圖規模1?-?maze_size?有圍墻
2void?randomMaze()
3{
4????int?i,?j,?rate;
5
6????for?(i?=?0;?i?<?maze_size.row?+?2;?i++)
7????{
8????????for?(j?=?0;?j?<?maze_size.col?+?2;?j++)
9????????{
10????????????//配置圍墻
11????????????if?((i?==?0)?||?(i?==?maze_size.row?+?1)?||?(j?==?0)?||?(j?==?maze_size.col?+?1))
12????????????{
13????????????????maze[i][j]?=?1;
14????????????}
15????????????else
16????????????{
17????????????????rate?=?rand()?%?10+1;
18????????????????if?(rate?<=?3)
19????????????????{
20????????????????????maze[i][j]?=?1;//隨機天生停滯
21????????????????}
22????????????????else
23????????????????{
24????????????????????maze[i][j]?=?0;
25????????????????}
26????????????}
27????????}
28????}
29????//最初保障出發點以及盡頭能走
30????maze[1][1]?=?maze[maze_size.row][maze_size.col]?=?0;
31}

找路

這個是整個法式設計的焦點功效,沒有之一。在寫代碼之前,咱們必要搞分明,到底怎么找路呢?

  1. 起首,把迷宮進口作為當前地位。
  2. 若是當前地位是迷宮出口,那末已經經找到一條路徑了,法式收場。
  3. 若是當前地位不是出口,則在當前地位放置停滯物,透露表現這里已經經來過,防止下次又反復繞歸來。然后反省相鄰地位是否能走。
  4. 若是一個相鄰地位能走,就挪移到這個地位上。然后在新的地位上從新最先探求出口。若是不克不及走,就測驗考試下一個相鄰地位。
  5. 若是一切的相鄰地位都不克不及走了,則歸退到上一個地位,從新選擇上一個地位的其余相鄰地位,持續索求。
  6. 若是一切的相鄰地位都被索求過了,依然找不到路徑,那申明這個迷宮不存在如許的路徑。

例如,上面的輿圖:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
圖8-9

好了,說了這么多,信賴人人已經經相識得差不多,而且伎癢了。

 1bool?findPath()
2{
3????POSITION?here;?//當前地位
4????here.row?=?here.col?=?1;
5????maze[1][1]?=?3;?//放置停滯,防止歸來
6????int?option?=?0;?//next?step
7????const?int?lastOption?=?3;?
8
9????//find?a?path
10????while?(?here.row?!=?maze_size.row?||?here.col?!=?maze_size.col)
11????{
12????????//not?reach?the?end
13????????int?r,?c;
14????????while?(option?<=?lastOption)
15????????{
16????????????r?=?here.row?+?offset[option].row;
17????????????c?=?here.col?+?offset[option].col;
18????????????if?(maze[r][c]?==?0)
19????????????{
20????????????????break;
21????????????}
22????????????option++;//next?choice
23????????}
24
25????????//相鄰的地位能走?
26????????if?(option?<=?lastOption)
27????????{
28????????????path.push(here);
29????????????here.row?=?r;
30????????????here.col?=?c;
31????????????maze[r][c]?=?3;?//走過了
32????????????option?=?0;
33????????}
34????????else
35????????{
36?????妞妞一直輸???????if?(path.empty())
37????????????{
38????????????????return?false;
39????????????}
40????????????//go?back
41????????????maze[here.row][here.col]?=?3;?//此路弗成通
42????????????here?=?path.top();
43????????????path.pop();
44????????????option?=?0;
45????????}
46????}
47
48????maze[maze_size.row][maze_size.col]?=?2;
49
50????return?true;
51}

相關代碼如下面所示,結合后面的講授,信賴人人也能望懂。

打印輿圖以及路徑

這個功效就比較簡略了,首要是依據maze的信息,天生響應的輿圖顯示進去給人人直觀的望到。關于maze內里存的數值,咱們也能夠作一個小小的規則:

  • 0
    透露表現地位可通暢。
  • 1
    透露表現地位有停滯。
  • 2
    透露表現該地位處在找到的路徑下面。
  • 3
    索求進程中放置的停滯物。這個停滯物以及1透露表現的停滯物不同的是,這個停滯咱們放置的,以及天生輿圖時的固定停滯物不同。是以仍是要區別開來的。

然后打印的時辰,遍歷maze數組,碰到:

  • 0
    打印空格。
  • 1
    打印*號。
  • 2
    打印#號,而且配置下顏色。
  • 3
    仍是打印空格。(或者者依據本人的喜愛打印另外的符號,如許就可以把索求過的一切地位顯示進去。)

最初在打印終極的輿圖以及路徑之前,若是找到一條路徑。咱們還要依據path中的路徑,在maze內里配置好響應的值,才做終極的輸入:

 1void?setPathOnMaze()
2{
3????POSITION?pos;
4????while?(!path.empty())
5????{
6????????pos?=?pat捕魚達人-遊戲h.top();
7????????path.pop();
8????????maze[pos.row][pos.col]?=?2;//路徑
9????}
10}
11
12然后,可以最先輸入咱們的輿圖了。

詳細代碼:

 1void?outputMaze()
2{
3????int?i,?j;
4????for?(i?=?0;?i?<?maze_size.row?+?2;?i++)
5????{
6????????for?(j?=?0;?j?<?maze_size.col?+?2;?j++)
7????????{
8????????????if?(maze[i][j]?==?1)
9????????????{
10????????????????cout?<<?公眾*"大眾;
11????????????}
12????????????else?if?((maze[i][j]?==?0)?||?(maze[i][j]?==?3))
13????????????{
14????????????????cout?<<?公眾?公眾;
15????????????}
16????????????els地下運彩ptte
17????????????{
18????????????????HANDLE?hOut;
19????????????????hOut?=?GetStdHandle(STD_OUTPUT_HANDLE);
20????????????????SetConsoleTextAttribute(hOut,FOREGROUND_GREEN?|?FOREGROUND_INTENSITY);
21????????????????cout?<<?"大眾#"大眾;
22????????????????SetConsoleTextAttribute(hOut,?FOREGROUND_RED?|?FOREGROUND_GREEN?|?FOREGROUND_BLUE);
23????????????}
24????????}
25????????cout?<<?endl;
26????}
27}

終極結果

  1. 沒有找到路的環境:

  2. 找到了路徑:

代碼獵取

欲獵取代碼,請存眷咱們的微信”號【法式猿聲】,在后臺答復:rat。即可下載。

保舉文章:10分鐘教你用Python做個打飛機小游戲超具體教程

保舉文章:10分鐘教你用python下載以及拼接微信摯友頭像圖片

保舉文章:10分鐘教你用python一行代碼弄點大消息

保舉文章:10分鐘教你用python打造饕餮蛇超具體教程

【免責聲明】本站內容轉載自互聯網,其相關談吐僅代表作者小我私家概念盡非權勢巨子,不代表本站態度。如您發明內容存在版權成績,請提交相關鏈接至郵箱:,咱們將實時予以處置。