3

ミニプログラムは、迷路を通るすべての可能なルートを印刷することになっています。ここで、入口/開始点は常に左上隅から1つ下にあり、すべての可能な出口は常に右の壁にあります。テキストファイルから迷路を取得します。

迷路は実際には単なるテキストの集まりです。迷路は、壁である「#」記号で構成されるnxnグリッドと、歩行可能な領域/パスを表すさまざまな文字[a...z]で構成されます。文字は繰り返すことができますが、並べることはできません。

迷路は15x15です。

大文字のSは常に入り口にラベルを付け、2番目に高い場所の左側の壁にあります。可能なパスは文字のみです-#記号の上を歩くことはできません。右側の壁にある文字はすべて出口を表しています。

例えば、

######
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

これをやってみませんか?完全なコードの答えは必要ありません。この問題に取り組む方法についてのガイダンスが必要です。

これまでのところ、隣接する正方形を再帰的にチェックしてそれらの上を歩くことができるかどうかを確認する実際のアルゴリズム自体を除いて、すべてを実行しました。複数のパスでどのように作業するかわかりません。

これは私がこれまでに持っているものです(パスチェックが間違っていることは知っていますが、他に何をすべきかわかりませんでした):

    #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

5 に答える 5

2

開始するには、いくつかのことが必要です。

  1. メモリ内の迷路を表現する方法-迷路のようなグリッドに適した「データ構造」
  2. その迷路にアクセスして操作するための方法
  3. 迷路をレンダリングする方法-おそらく迷路を印刷するため
  4. 進捗状況を追跡する方法
  5. 手元の問題を解決するためのアルゴリズム

はるかに小さい迷路(おそらく3x3のサイズの迷路)から始めて、マップをまっすぐ横切るパスを作成することを検討してください。あなたのプログラムはそれを解決できるはずです。次に、パスを変更して少しカーブさせます。次に、マップを大きくします。パスを難しくします。いくつかの「赤いニシン」の枝を道から外します。

マップが小さくなり、複雑さが増すと、作業のデバッグがはるかに簡単になります。(そして、デバッガーの使用方法がわからない場合は、開始するのに小さな問題があると、デバッガーの学習が容易になります。)

幸運を!

于 2012-05-24T02:52:59.573 に答える
2

通常の方法(特に学校の課題の場合)は、再帰的に対処することです。指定された開始点から開始します。そこから可能な各正方形を再帰的に試してください(上、右、下)。

これにおける唯一の本当の「トリック」は、あなたがすでに訪れた広場を追跡することです。1つの可能性は、入力時に値を正方形に保存し、他の正方形を再帰的に検索する前に、他の方法で使用されない値に設定することです(たとえば、「。」が機能するはずです)。

于 2012-05-24T03:27:44.460 に答える
1

シンボルを配列にロードします。次に、各位置を再帰的にチェックします。上、下、左、右に移動できますか?そこから、これらのブール回答を0または1として別の配列に保存し、それを使用して続行できます...コピー配列が特定の方向に続行できるかどうかに基づいて。

また、間違いなくいくつかの新しいメソッドを作成します...私は通常、メインメソッドにほとんど含めないようにします...

それがお役に立てば幸いです、私がそれをもっと見る時間があればいいのに...

-P

于 2012-05-25T21:04:06.867 に答える
1

もちろん、私が最初に行うことは、ファイルを読み込んでデータ構造に配置し、実際に操作できるようにすることです。これが宿題の場合、割り当てによってパスファインディングアルゴリズムを学習できる可能性が高くなります。ダイクストラのアルゴリズムを調べてみてください。これで開始できます。

于 2012-05-24T02:49:23.540 に答える
1

非常に高レベルのアプローチ:

迷路を通ることができるパスを説明するツリーを作成します。右側で終わるものを印刷します。

自分自身を包み込むパスをどのように検出しますか?(または、迷路にこの問題はありませんか?)

于 2012-05-24T02:51:17.047 に答える