미궁 의 문제 를 귀착 하여 풀다
미로를 풀기 위한 귀환 절차는 네 가지 방향으로 갈 수 있는지 검사하고, 죽음의 길을 만나면 원래의 길로 귀환하여false로 돌아가고, 출구를 만나면true로 돌아가며 장래의 노선을 대열에 저장하는 것이다.
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
int maze[10][15] = {
{1,0,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,1},
{1,1,1,0,1,0,1,1,0,1,1,0,1,1,1},
{1,0,0,0,1,0,1,0,0,1,1,0,1,1,1},
{1,0,1,1,1,0,1,1,0,1,1,0,0,0,1},
{1,0,1,1,1,0,1,1,0,1,1,0,1,1,1},
{1,0,0,0,0,0,1,1,0,1,0,0,1,1,1},
{1,1,1,1,1,1,0,0,0,1,1,0,0,0,1},
{1,1,0,0,0,0,0,1,1,0,0,0,1,1,1},
{1,1,1,1,1,1,1,1,1,0,1,1,1,1,1}};
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
struct SPoint{
int x;
int y;
};
static int count = 0;
//struct Compare{
// bool operator() ( const SPoint& p1, const SPoint& p2) const
// {
// if (p1.x < p2.x)
// {
// return true;
// }
// else if (p1.x == p2.x)
// {
// if (p1.y < p2.y)
// {
// return true;
// }
// }
// return false;
// }
//};
bool walk(std::vector<SPoint>& routeVector, int srcDirect, SPoint nowPoint)
{
count++;
//
/*for (std::vector<SPoint>::iterator it = routeVector.begin(); it != routeVector.end(); ++it)
{
if ((*it).x == nowPoint.x && (*it).y == nowPoint.y)
{
return false;
}
}*/
//
if (1 == nowPoint.x && 0 == nowPoint.y )
{
routeVector.push_back(nowPoint);
return true;
}
int nowX = nowPoint.x;
int nowY = nowPoint.y;
SPoint nextPoint;
bool passFlag = false;
for(int direct = 1; direct <= 4; ++direct)
{
//
if (srcDirect == direct)
{
continue;
}
switch(direct)
{
case UP:
{
if (maze[nowY - 1][nowX] == 0)
{
nextPoint.x = nowX;
nextPoint.y = nowY -1;
if(walk(routeVector, DOWN, nextPoint))
{
passFlag = true;
}
}
break;
}
case DOWN:
{
if (maze[nowY + 1][nowX] == 0)
{
nextPoint.x = nowX;
nextPoint.y = nowY +1;
if(walk(routeVector, UP, nextPoint))
{
passFlag = true;
}
}
break;
}
case LEFT:
{
if (maze[nowY][nowX - 1] == 0)
{
nextPoint.x = nowX - 1;
nextPoint.y = nowY;
if(walk(routeVector, RIGHT, nextPoint))
{
passFlag = true;
}
}
break;
}
case RIGHT:
{
if (maze[nowY][nowX + 1] == 0)
{
nextPoint.x = nowX + 1;
nextPoint.y = nowY;
if(walk(routeVector, LEFT, nextPoint))
{
passFlag = true;
}
}
break;
}
default:
break;
}
}
if (passFlag)
{
routeVector.push_back(nowPoint);
}
return passFlag;
}
void print_maze()
{
for (int raw = 0; raw < 10; ++raw)
{
for (int column = 0; column < 15; ++column)
{
if (maze[raw][column] == 1)
{
printf("■");
}
else if(maze[raw][column] == 2)
{
printf("★");
}
else
{
printf(" ");
}
if (column == 14)
{
printf("
");
}
}
}
}
void paving(std::vector<SPoint> routeVec)
{
for (std::vector<SPoint>::iterator it = routeVec.begin(); it != routeVec.end(); ++it)
{
int raw = (*it).y;
int column = (*it).x;
maze[raw][column] = 2;
}
}
int main(int argc, char* argv[])
{
for (int i = 0; i < argc; ++i)
{
printf(" : %s
", argv[i]);
}
SPoint point;
point.x = 9;
point.y = 9;
SPoint nextPoint;
nextPoint.x = 9;
nextPoint.y = 8;
std::vector<SPoint> routeVec;
walk(routeVec, DOWN, nextPoint);
routeVec.push_back(point);
paving(routeVec);
print_maze();
printf(" : %d", count);
while(true);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.