2012-05-24 132 views
3

迷你程序應該打印出迷宮中所有可能的路線,其中入口/出發點總是從左上角向下,所有可能的出口始終在右側壁。它從文本文件中檢索迷宮。C++「迷宮」作業

迷宮實際上只是一堆文本。 迷宮由一個n×n網格組成,由「#」符號組成,這些符號是牆,以及表示可行走區域/路徑的各種字母[a ... z]。字母可以重複,但不能並排。

迷宮是15x15。

大寫字母S總是標記入口,位於第二個最高點的左側牆上。一條可能的路徑只能通過字母 - 你不能在#符號上行走。右側牆上的任何信件都代表退出。

例如,

###### 
Sa#hln 
#bdp## 
##e#ko 
#gfij# 
###### 

是一種可能的迷宮。在閱讀實際包含迷宮的文本文件後,我的小程序應該打印出所有可能的路線。

調用該程序會產生以下輸出到屏幕上:

Path 1: S,a,b,d,e,f,i,j,k,o 
Path 2: S,a,b,d,p,h,l,n 
2 total paths 

如何我會去這樣做?我不需要一個完整的代碼答案,我只想要一些關於如何解決這個問題的指導。

到目前爲止,除了實際的算法本身,遞歸檢查adajcent方塊以查看是否可以在它們上行走,並且我不知道如何在多個路徑上工作,我已經做了所有事情。

這是我迄今爲止(我知道我的pathcheck是錯的,但我不知道我還能做什麼):

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <sstream> 
#include <cstdio> 
using namespace std; 

ifstream file("maze.txt"); 
vector<char> vec(istreambuf_iterator<char>(file), (istreambuf_iterator<char>())); // Imports characters from file 
vector<char> path;      // Declares path as the vector storing the characters from the file 
int x = 18;        // Declaring x as 18 so I can use it with recursion below 
char entrance = vec.at(16);    // 'S', the entrance to the maze 
char firstsquare = vec.at(17);   // For the first walkable square next to the entrance 
vector<char> visited;     // Squares that we've walked over already 

int main() 
{ 
    if (file) { 
     path.push_back(entrance);    // Store 'S', the entrance character, into vector 'path' 
     path.push_back(firstsquare);   // Store the character of the square to the right of the entrance 
               // into vector 'path'. 

     while (isalpha(vec.at(x))) 
     { 
      path.push_back(vec.at(x)); 
      x++; 
     } 

     cout << "Path is: ";     // Printing to screen the first part of our statement 

     // This loop to print to the screen all the contents of the vector 'path'. 
     for(vector<char>::const_iterator i = path.begin(); i != path.end(); ++i) // 
     { 
     std::cout << *i << ' '; 
     } 

     cout << endl; 
     system ("pause");      // Keeps the black box that pops up, open, so we can see results. 
     return 0; 
     } 
} 

謝謝!

+4

你有什麼試過的?您是否陷入瞭解決方案的某些方面?你是否已經完成了基礎知識,比如將文件中的迷宮讀入程序中的數據結構中? –

+0

是否允許使用遞歸函數? –

+1

我會使用遞歸和保存當前狀態的列表,每次遞歸都會爲下一步做4次遞歸調用。在每次遞歸時檢查當前位置是否已被訪問,以及是否爲結束塊。 – bdares

回答

2

你需要一些東西來啓動:

  1. 代表記憶迷宮的方式 - 「數據結構」這是適合於像迷宮
  2. 方法訪問和操作一格該迷宮
  3. 渲染迷宮的方法 - 也許打印出一個迷宮
  4. 跟蹤你的進度
  5. 算法手頭
  6. 解決問題的辦法

考慮從一個更小的迷宮開始 - 可能是一個尺寸爲3x3的迷宮 - 具有直接穿過地圖的路徑。你的程序應該能夠解決這個問題。然後改變路徑曲線一下。然後製作更大的地圖。讓路徑變得更難。在路上有一些「紅鯡魚」分支。

較小的地圖,複雜度越來越高,應該使調試工作變得更容易。 (如果你不知道如何使用調試器,啓動一個小問題將會使調試器的學習更容易。)

祝你好運!

1

我首先要做的是讀取文件並將其放入數據結構中,以便實際使用它。如果這是作業,那麼作業最有可能讓你學習路徑尋找算法,試着查找Dijkstra的算法,這應該讓你開始。

+0

我正在考慮使用ifstream來讀取文件...現在我怎麼將它放入數據結構?我是新來的C++ – forthewinwin

+2

@forthewinwin嗯,可以說你只需選擇一個二維數組作爲你的結構,你將逐字讀入文件並將它們放入下一個數組位置。遇到新行時,請移至陣列中的下一行。 – RoneRackal

1

一個非常高層次的方法:

創建描述您可以通過迷宮的路徑樹。打印出結束於右側的結果。

你會如何檢測自身環繞的路徑? (或者你的迷宮不會有這個問題?)

2

通常的方法(尤其是學校作業)是遞歸地處理它。從指定的起點開始。從那裏遞歸地嘗試每個可能的方塊(在上面,到右下方)。

在這個唯一真正的「技巧」是跟蹤你已經訪問過哪些廣場。一種可能是在輸入時將值保存在一個正方形中,然後在遞歸搜索其他正方形之前將其設置爲一個未使用的值(例如,'。'應該適用於您的情況)。

+1

@forthewinwin我還建議你看看[A *算法](http://en.wikipedia.org/wiki/A*_search_algorithm)。 –

+2

對於所有的路由,洪水填充類型算法(遞歸或使用堆棧)絕對是一種可行的方式。 A *只能找到一條路線。 –

+0

我試圖讓它在除了正確的方向以外的其他方向..我該怎麼做?我可以分別爲每個方向增加位置,但是我如何將每個位置融合在一起? – forthewinwin

1

將符號加載到數組中。然後遞歸地檢查每個位置:它可以上升,下降,左側,右側?從那裏,您可以將這些布爾答案保存爲0或1到一個單獨的數組中,並根據您的副本數組是否說明您可以或不可以繼續某個方向來繼續。

此外,必然會使一些新的方法......我平時儘量包括在main方法很少......

希望有所幫助,希望我有時間看它更多...

-P