거 슬러 올 라 가 미궁 을 구하 다.
13876 단어 데이터 구조
먼저 구조 체 를 정의 하여 좌 표를 저장 합 니 다.
template
class Maze
{
public:
Maze(int maze[M][N])
{
for (size_t i = 0; i < M; ++i)
{
for (size_t j = 0; j < N; ++j)
{
_maze[i][j] = maze[i][j];
}
}
}
struct Pos
{
int _row; //
int _col; //
};
함 수 를 만들어 서 내 려 갈 수 있 는 지 없 는 지 를 판단 하고 그 위치 가 0 인지 아 닌 지 를 판단 합 니 다.
bool CheckAccess(Pos next)
{
if ((next._row >= 0 && next._row < M)
&&(next._col >= 0 && next._col <= N)
&& _maze[next._row][next._col] == 0)
{
return true;
}
return false;
}
이어서 해답 을 구하 다
bool GetMazePath(Pos entry)
{
stack paths;
paths.push(entry);
while (!paths.empty())
{
//
Pos cur = paths.top();
_maze[cur._row][cur._col] = 2;
//
if (cur._row == M-1)
{
return true;
}
//
//
Pos next = cur;
next._row -= 1;
if(CheckAccess(next))
{
paths.push(next);
continue;
}
//
next = cur;
next._col += 1;
if(CheckAccess(next))
{
paths.push(next);
continue;
}
//
next = cur;
next._row += 1;
if(CheckAccess(next))
{
paths.push(next);
continue;
}
//
next = cur;
next._col -= 1;
if(CheckAccess(next))
{
paths.push(next);
continue;
}
Pos back = paths.top();
_maze[back._row][back._col] = 3;
paths.pop();
}
return false;
}
bool GetMazePathR(Pos entry)
{
Pos cur = entry;
_maze[cur._row][cur._col] = 2;
//
if (entry._row == N-1)
{
return true;
}
Pos next = cur;
//
next._row -= 1;
if (CheckAccess(next))
{
//
if (GetMazePathR(next))
return true;
}
//
next = cur;
next._col += 1;
if (CheckAccess(next))
{
if (GetMazePathR(next))
return true;
}
//
next = cur;
next._row += 1;
if (CheckAccess(next))
{
if (GetMazePathR(next))
return true;
}
//
next = cur;
next._col -= 1;
if (CheckAccess(next))
{
if (GetMazePathR(next))
return true;
}
//
_maze[cur._row][cur._col] = 3;
return false;
}
검 측 을 위해 함 수 를 계속 구축 합 니 다.
bool CheckAccess(Pos next, Pos cur)
{
if ((next._row >= 0 && next._row < M)
&&(next._col >= 0 && next._col <= N))
{
if (_maze[next._row][next._col] == 0)
{
return true;
}
else if (_maze[next._row][next._col] == 1)
{
return false;
}
else
{
return _maze[next._row][next._col] > _maze[cur._row][cur._col]+1;
}
}
else
{
return false;
}
}
다음 최 단 경로 구하 기
void GetShortPath(Pos entry,
stack & path, stack & shortPath)
{
Pos cur = entry;
path.push(cur);
//
if (entry._row == N-1)
{
Print();
if (shortPath.empty() || path.size() < shortPath.size())
{
shortPath = path;
}
}
Pos next = cur;
//
next._row -= 1;
if (CheckAccess(next, cur))
{
//
_maze[next._row][next._col] = _maze[cur._row][cur._col] + 1;
GetShortPath(next, path, shortPath);
}
//
next = cur;
next._col += 1;
if (CheckAccess(next, cur))
{
_maze[next._row][next._col] = _maze[cur._row][cur._col] + 1;
GetShortPath(next, path, shortPath);
}
//
next = cur;
next._row += 1;
if (CheckAccess(next, cur))
{
_maze[next._row][next._col] = _maze[cur._row][cur._col] + 1;
GetShortPath(next, path, shortPath);
}
//
next = cur;
next._col -= 1;
if (CheckAccess(next, cur))
{
_maze[next._row][next._col] = _maze[cur._row][cur._col] + 1;
GetShortPath(next, path, shortPath);
}
path.pop();
}
나머지 코드 는 다음 과 같다.
protected:
int _maze[M][N];
};
void ReadMaze(int maze[10][10])
{
FILE* fout = fopen("MazeMap.txt", "r");
assert(fout);
for (size_t i = 0; i < 10; ++i)
{
for (size_t j = 0; j < 10;)
{
char ch = fgetc(fout);
if (ch == '0' || ch == '1' || ch == '2')
{
maze[i][j] = ch - '0';
++j;
}
}
}
}
void TestMaze()
{
// ?
// ?
// -- ?
int maze[10][10];
ReadMaze(maze);
Maze<10, 10> m(maze);
Maze<10, 10>::Pos entry;
entry._row = 2;
entry._col = 0;
//m.GetMazePath(entry);
//cout<
stack ::Pos> path, shortPath;
m.GetShortPath(entry, path, shortPath);
//m.Print();
}
미궁 구 해 는 데이터 구조의 학습 에 큰 도움 이 되 었 습 니 다. 이 코드 는 저 는 일주일 여 동안 작성 하고 이 해 했 습 니 다. 처음에 약간 은 완전히 이해 하지 못 했 습 니 다. 매일 여러 번 생각 하고 테스트 를 한 후에 마지막 으로 썼 습 니 다.나 처럼 이 부분 을 공부 하고 있 는 학우 들 이 많이 생각 하고 온고지신 하 기 를 바란다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.