C 언어 는 간단 한 미로 - 역 추적 법 (재 귀) 을 실현 한다.
12518 단어 데이터 구조
미로:
0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0
사고방식: 1. 미궁 지도의 입구 좌 표를 전송 하여 입구 좌표 가 정확 한 지 판단 한다.2. 미 로 를 시작 하여 현재 좌표 (Cur) 를 창고 에 넣 고 어느 방향 으로 가 려 고 합 니 다.
위: 위로 올 라 가면 위 에서 걸 을 수 있 는 지 여 부 를 판단 하고 위로 올 라 갈 수 있 으 며 다음 단 계 는 현재 값 + 1 로 수정 합 니 다. 현재 좌표 로 돌아 가 위로 올 라 갈 수 없 을 때 까지 계속 앞으로 갑 니 다.
왼쪽: 올 라 가면 왼쪽 이 안 되 고 갈 수 있 는 지 판단 하면 왼쪽으로 갈 수 있 으 며 다음 단 계 는 현재 값 + 1 로 수정 합 니 다. 현재 좌표 로 돌아 가 왼쪽 으로 갈 수 없 을 때 까지 계속 왼쪽으로 갑 니 다.
오른쪽: 왼쪽 이 통 하지 않 고 오른쪽 이 통 하지 않 습 니 다. 갈 수 있 는 지 판단 하면 오른쪽으로 갈 수 있 습 니 다. 그리고 다음 단 계 는 현재 값 + 1 입 니 다. 현재 좌 표를 되 돌려 오른쪽으로 가면 안 될 때 까지 오른쪽으로 갑 니 다.
아래: 오른쪽 이 통 하지 않 고 내 려 갈 수 있 는 지 판단 하면 내 려 갈 수 있 습 니 다. 다음 단 계 는 현재 값 + 1 입 니 다. 현재 좌표 로 돌아 가 내 려 갈 수 없 을 때 까지 계속 내 려 갑 니 다.
3. 반복 과정 24. 출구 를 찾 으 면 출구 가 두 개 있 을 수 있 으 므 로 서둘러 물 러 나 서 다른 출구 가 있 는 지 찾 아야 한다. 5. 수출 의 가장 짧 은 경 로 는 주로 재 귀적 인 생각 을 사용 하고 지나 간 길 은 반복 되 지 않 는 다. 그리고 지나 간 후에 모든 값 은 > 1 의 숫자 로 변 한다.
#define ROW 6
#define COL 6
#define MAX 20
typedef int DataType;
typedef struct postion
{
int _x;
int _y;
}position;
typedef position SDataType;
typedef struct Stack
{
SDataType array[MAX];
int top;
}Stack;
typedef struct Maze
{
DataType _map[ROW][COL];
}Maze;
void InitMaze(int map[ROW][COL],Maze* m);//
void PrintfMaze(Maze* m);//
void PassMaze(Maze* m, SDataType enter);//
스 택 에 좌표 형식 을 눌 러 서 데 이 터 를 만 들 려 면 좌표 형식의 구조 체 를 만 들 고 좌표 형식 으로 스 택 의 유형 을 정의 해 야 합 니 다.
void InitMaze(int map[ROW][COL],Maze* m)//
{
int i = 0;
int j = 0;
assert(m);
for (; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
m->_map[i][j] = map[i][j];
}
}
}
void PrintfMaze(Maze* m)//
{
int i = 0;
int j = 0;
assert(m);
for (; i < ROW; i++)
{
for (j = 0; j < COL; j++)
printf("%3d", m->_map[i][j]);
printf("
");
}
}
int IsValid(SDataType enter)//
{
if (0 == enter._x || 0 == enter._y || ROW - 1 == enter._x || COL - 1 == enter._y)
return 1;
return 0;
}
int IsExit(SDataType Cur,SDataType enter)//
{
if ((0 == Cur._x || 0 == Cur._y || ROW - 1 == Cur._x || COL - 1 == Cur._y) && (Cur._x != enter._x || Cur._y != enter._y))
return 1;
return 0;
}
int IsPass(Maze* m, SDataType next)//
{
assert(m);
if (next._x < ROW && next._y < COL && next._x >= 0 && next._y >= 0)
{
if (1 == m->_map[next._x][next._y])
return 1;
}
return 0;
}
void SaveShortPath(Stack* Path, Stack* ShortPath)//
{
int i = 0;
for (; i < StackSize(Path); i++)
ShortPath->array[i] = Path->array[i];
ShortPath->top = Path->top;
}
void _GetPassMaze(Maze* m, SDataType enter, SDataType Cur, Stack* Path, Stack* ShortPath)//
{
SDataType next;
if (!StackSize(Path))// , 2
m->_map[enter._x][enter._y] = 2;
if (IsExit(Cur, enter))//
{
StackPush(Path, Cur);
if (!StackSize(ShortPath) || StackSize(Path) < StackSize(ShortPath))
SaveShortPath(Path, ShortPath);//
StackPop(Path);
return;
}
StackPush(Path, Cur);
//
next = Cur;
next._x -= 1;
if (IsPass(m, next, Cur))//
{
m->_map[next._x][next._y] = m->_map[Cur._x][Cur._y] + 1;
_GetPassMaze(m, enter, next, Path, ShortPath);
}
//
next = Cur;
next._y -= 1;
if (IsPass(m, next, Cur))//
{
m->_map[next._x][next._y] = m->_map[Cur._x][Cur._y] + 1;
_GetPassMaze(m, enter, next, Path, ShortPath);
}
//
next = Cur;
next._y += 1;
if (IsPass(m, next, Cur))//
{
m->_map[next._x][next._y] = m->_map[Cur._x][Cur._y] + 1;
_GetPassMaze(m, enter, next, Path, ShortPath);
}
//
next = Cur;
next._x += 1;
if (IsPass(m, next, Cur))//
{
m->_map[next._x][next._y] = m->_map[Cur._x][Cur._y] + 1;
_GetPassMaze(m, enter, next, Path, ShortPath);
}
StackPop(Path);
}
void PassMaze(Maze* m, SDataType enter)
{
Stack ShortPath;
Stack Path;
assert(m);
InitStack(&Path);
InitStack(&ShortPath);
if (!IsValid(enter))
return;
_GetPassMaze(m, enter, enter, &Path, &ShortPath);// ,
}
void Test()//
{
SDataType enter;
Maze m;
int map[ROW][COL] = { 0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,1,1,1,
0,0,1,0,0,0 };
InitMaze(map,&m);
PrintfMaze(&m);
printf("
");
enter._x = 5;
enter._y = 2;
PassMaze(&m, enter);
PrintfMaze(&m);
}
위의 이 코드 는 몇 개의 스 택 의 기본 함수 가 주지 않 아서 스스로 완벽 하 게 호출 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.