2012-03-19 15 views
1

私は、迷路に関する情報を含むファイルを読み、その情報を使って迷路のパスを見つけるプログラムに取り組んでいます。私が持っている問題は配列の迷路を表すことです。私は配列の中の壁としてそれらを表現するために、Xを整数に変換する方法がわかりません。 1つの引数のコンストラクタでは、forループを使用してファイルを調べ、各文字を適切な配列インデックスに配置します。私がこれを行ったやり方は明らかにうまくいかず、アレイの迷路をいかに適切に表現するかについて誰かが助言を与えることができたら、私はそれを感謝するでしょう。テキストファイルを読み込んで迷路を作成する

/**@file Maze.h*/ 

    #include <iostream> 
    #include <string> 
    #include <fstream> 
    using namespace std; 

    const int MAX_ROW = 60; 
    const int MAX_COL = 40; 
    const int WALL = 0; 
    const int CLEAR = 1; 
    const int PATH = 2; 
    const int VISITED = 3; 

    struct Position 
    { 
     int r; 
     int c; 
    }; 
    class Maze 
    { 
    public: 
    Maze(); 

    /*One argument constructor that takes a filename and reads 
    *the contents of a maze file. 
    */ 
    Maze(string filename); 
    void displayMaze(); 
    bool isWall(Position p); 
    bool isPath(Position p); 
    bool isClear(Position p); 
    bool isVisited(Position p); 
    void setWall(Position p); 
    void setPath(Position p); 
    void setClear(Position p); 
    void setVisited(Position p); 
    Position getEntrance(); 
    Position getExit(); 
    private: 
     int row; 
     int col; 
     Position exit; 
     Position entrance; 
     int maze[MAX_ROW][MAX_COL]; 
    }; 

/**@file Maze.cpp*/ 

#include "Maze.h" 

Maze::Maze() 
{} 

Maze::Maze(string filename) 
{ 
    ifstream inStream; 
    inStream.open(filename.c_str()); 
    if(inStream.fail()) 
{ 
    cout << "Input file opening failed.\n"; 
} 
//Get the dimensions of the maze. 
inStream >> col >> row; 
//Get the exit to the maze. 
inStream >> exit.r >> exit.c; 
//Get the entrance to the maze. 
inStream >> entrance.r >> entrance.c; 
//Read maze from the file. 
for(int r = 0; r < row; r++) 
{ 
    for(int c = 0; c < col; c++) 
    { 
     inStream >> maze[r][c]; 
     if(maze[r][c])== 'X') 
      maze[r][c] = WALL; 
     else 
      maze[r][c] = CLEAR; 
    } 
} 
}//end one argument constructor 

void Maze::displayMaze() 
{ 
cout << '\t' << '\t' << "Row" << '\t' << "Column" << endl; 
cout << "Dimensions:" << '\t' << row << '\t' << col << endl; 
cout << "Exit:" << '\t' << '\t' << exit.r << '\t' << exit.c << endl; 
cout << "Entrance: " << '\t' << entrance.r << '\t' << entrance.c << endl; 

for(int r = 0; r < row; r++) 
{ 
    for(int c = 0; c < col; c++) 
    { 
     cout << maze[r][c]; 
    } 
    cout << endl; 
} 
}//end displayMaze() 

bool Maze::isWall(Position p) 
{ 
return maze[p.r][p.c] == WALL; 
}//end isWall() 

bool Maze::isPath(Position p) 
{ 
return maze[p.r][p.c] == PATH; 
}//end isPath() 

bool Maze::isClear(Position p) 
{ 
return maze[p.r][p.c] == CLEAR; 
}//end isClear() 

bool Maze::isVisited(Position p) 
{ 
return maze[p.r][p.c] == VISITED; 
}//end isVisited() 

void Maze::setWall(Position p) 
{ 
maze[p.r][p.c] = WALL; 
}//end setWall() 

void Maze::setPath(Position p) 
{ 
maze[p.r][p.c] = PATH; 
}//end setPath() 

void Maze::setClear(Position p) 
{ 
maze[p.r][p.c] = CLEAR; 
}//end setClear() 

void Maze::setVisited(Position p) 
{ 
maze[p.r][p.c] = VISITED; 
}//end setVisited() 

Position Maze::getEntrance() 
{ 
return entrance; 
}//end getEntrance() 

Position Maze::getExit() 
{ 
return exit; 
}//end getExit() 

次に、ファイルの内容の例を示します。最初の数字の組は、列と行の迷路の寸法です。第2の数字の組は出口の行と列の位置であり、第3の組の数字は入口の行と列の位置である。

+1

これは機能しません...どのような方法でですか? – jrok

+0

forループでは、私は迷路の各部分を配列に読み込もうとしています。ただし、ifステートメントはスキップされており、すべてのスペースがCLEARとマークされるようにelseステートメントだけが実行されています。私はどのようにファイルのXが0(ゼロ)の配列で表されるようにファイルを読み取るのだろうかと思います。 – Eric

+0

'char'sを保持するように配列を変更してみてください。 – jrok

答えて

2

迷路の接続性を表すには、迷路内の位置をパスが存在する隣接セルのリストに関連付けることができます。リストは、実際のリスト、またはビットマップなどのよりコンパクトな表現であってもよい。 1010は、東と西ではなく、北と南に行くことができるということです。

迷路よりも大きい(つまり、配列の迷路周辺の境界細胞を含む)配列を使用すると、迷路セルの隣接する細胞を参照することができますエッジ条件。

関連する問題