[데이터 구조] 간단 한 미로 (재 귀적 으로 실현)
4086 단어 데이터 구조
귀속 에 대한 간단 한 이해: 클릭 하여 링크 열기
Maze.h
#pragma once
#include"stack.h"
#include
#include
#include
#include
#include
#define MAX_ROW 4
#define MAX_COL 4
typedef struct Position
{
int _x;
int _y;
}Position;
typedef struct Maze
{
int _map[MAX_ROW][MAX_COL];
}Maze;
//
void InitMaze(Maze* m, int map[][MAX_COL]);
//
int IsValidEntry(Maze* m, Position entry);
//
int IsPass(Maze* m, Position cur);
//
int IsExit(Maze* m, Position cur, Position entry);
//
int _PassMaze(Maze* m, Position entry, Position cur, Stack* s);
// , : ,
void PassMaze(Maze* m, Position entry, Stack* s);
//
void PrintMaze(Maze* m, int map[][MAX_COL]);
Maze.c
#include"Maze.h"
#include"stack.h"
//
void InitMaze(Maze* m, int map[][MAX_COL])
{
assert(&m);
int i = 0;
for (; i < MAX_ROW; i++)
{
int j = 0;
for (; j < MAX_COL; j++)
{
m->_map[i][j] = map[i][j];
}
}
}
//
int IsValidEntry(Maze* m, Position entry)
{
assert(m);
if ((entry._x == 0 || entry._y == 0) ||
(entry._x == MAX_ROW - 1 || entry._y == MAX_COL - 1) &&
(m->_map[entry._x][entry._y] == 1))
return 1;
return 0;
}
//
int IsPass(Maze* m, Position cur)
{
assert(m);
if ((cur._x >= 0 && cur._x <= MAX_ROW - 1) &&
(cur._y >= 0 && cur._y <= MAX_COL - 1) &&
(m->_map[cur._x][cur._y] == 1))
return 1;
return 0;
}
int IsExit(Maze* m, Position cur, Position entry)
{
assert(m);
if ((entry._x == 0 || entry._y == 0) ||
(entry._x == MAX_ROW - 1 || entry._y == MAX_COL - 1) &&
(m->_map[entry._x][entry._y] == 1) &&
(entry._x != cur._x) && (entry._y != cur._y))
return 1;
return 0;
}
//
int _PassMaze(Maze* m, Position entry, Position cur, Stack* s)
{
assert(m);
assert(s);
Position next;
if (IsPass(m, cur)) //
{
StackPush(s, cur); //
if (IsExit(m, cur, entry)) //
{
m->_map[cur._x][cur._y] = 2; // 2
return 1;
}
m->_map[cur._x][cur._y] = 2; // 2
//1.
next = cur; //
next._x -= 1; //
if (_PassMaze(m, entry, next, s)); //
return 1;
//2.
next = cur; //
next._y -= 1; //
if (_PassMaze(m, entry, next, s)); //
return 1;
//3.
next = cur; //
next._y += 1; //
if (_PassMaze(m, entry, next, s)); //
return 1;
//4.
next = cur; //
next._x += 1; //
if (_PassMaze(m, entry, next, s)); //
return 1;
// 3
m->_map[cur._x][cur._y] = 3;
StackPop(s);
}
return 0;
}
// , : ,
void PassMaze(Maze* m, Position entry, Stack* s)
{
assert(m);
assert(s);
if (!IsValidEntry(m, entry)) //
{
printf(" !!!!
");
return;
}
//
_PassMaze(m, entry,entry,s);
}
//
void PrintMaze(Maze* m, int map[][MAX_COL])
{
assert(m);
int i = 0;
for (; i < MAX_ROW; i++)
{
int j = 0;
for (; j < MAX_COL; j++)
{
printf("%d ", m->_map[i][j]);
}
printf("
");
}
printf("
");
}
test.c
#include"Maze.h"
#include"stack.h"
void TestMaze()
{
Stack s;
Position entry;
Maze m;
StackInit(&s,10);
int map[4][4] = {
{0,0,0,0},
{0,1,0,0},
{0,1,1,1},
{0,1,0,0}
};
InitMaze(&m, map);
PrintMaze(&m, map);
entry._x = 3;
entry._y = 1;
PassMaze(&m, entry,&s); //
printf("
");
PrintMaze(&m, map);
}
int main()
{
Stack s;
TestMaze();
system("pause");
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.