창고 의 응용 - 미궁 문제 - 데이터 구조
3875 단어 데이터 구조
바로 검색 을 거 슬러 올 라 가 두 번 썼 고, 첫 번 째 작은 문 제 는 두 시 까지 조정 되 지 않 았 으 며, 다음날 아예 다시 썼 고, 한 번 에 나 왔 다.
뒤의 몇 가지 예 가 운행 되 었 는데 문제 가 없 었 습 니 다. 어떤 문 제 는 잠시 발견 되 지 않 았 을 수도 있 습 니 다. 주로 OJ 와 같 지 않 습 니 다. 사람들 은 이미 데 이 터 를 구 조 했 기 때문에 자신 은 게 으 르 게 데 이 터 를 구 조 했 습 니 다.
예 코드:
#include
#include
#include
#define Initstacksize 100
#define Increase 100
typedef struct PosType //
{
int x;
int y;
}PosType;
typedef struct MazeType
{
char **maze; //
int **mark; //
int row; //
int col; //
}MazeType;
typedef struct SElemType
{
int ord; //
PosType seat; //
int dir; //
}SElemType;
typedef struct SqStack //
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
void CreatMaze(MazeType &ma) //
{
int i,j;
char ch;
printf("Input the row and the col of the maze:
");
scanf("%d%d",&ma.row,&ma.col);
ma.maze=(char**)malloc(Initstacksize*sizeof(char*));
ma.mark=(int**)malloc(Initstacksize*sizeof(int*));
ch=getchar();
for(i=0;i=maa.row || std.y>=maa.col || maa.maze[std.x][std.y]=='#' || maa.mark[std.x][std.y]>0)
return 0;
else return 1;
}
SElemType UpdatE(PosType p,int step,int di) // : , ,
{
SElemType ee;
ee.ord=step;
ee.dir=di;
ee.seat=p;
return ee;
}
void PushStack(SqStack &S,SElemType ee) //
{
if(S.top-S.top>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(Increase+Initstacksize)*sizeof(SElemType));
S.top=S.base+S.stacksize;
S.stacksize+=Increase;
}
*S.top++=ee;
}
bool EmptyStack(SqStack S) //
{
if(S.base==S.top) return true;
else return false;
}
void MakePrint(MazeType &maa,PosType p) //
{
maa.mark[p.x][p.y]=1;
}
PosType NextPos(PosType p,int di) //
{
PosType np;
np=p;
switch(di)
{
case 1:np.x++;break; //
case 2:np.y++;break; //
case 3:np.x--;break; //
case 4:np.y--;break; //
default:break;
}
return np;
}
void PopStack(SqStack &ss,SElemType &ee) //
{
ss.top--;
ee=*ss.top;
}
void NoPrint(MazeType &maa,PosType p) //
{
maa.mark[p.x][p.y]=2;
}
int MazePath(MazeType ma,SqStack &s,PosType st,PosType ed) //
{
PosType curpos;
SElemType e;
int curstep;
curstep=1;
curpos=st;
if(!PassOk(st,ma)) return 0;// OK
MakePrint(ma,curpos); //
e=UpdatE(curpos,curstep,1); //
PushStack(s,e); // ,
curpos=NextPos(curpos,1); //
curstep++;
while(!EmptyStack(s))
{
if(PassOk(curpos,ma))
{
MakePrint(ma,curpos);
e=UpdatE(curpos,curstep,1);
PushStack(s,e);
if(curpos.x==ed.x&& curpos.y==ed.y) return 1; //
curpos=NextPos(curpos,1);
curstep++;
}
else
{
if(!EmptyStack(s))
{
PopStack(s,e); //
while(e.dir==4 && !EmptyStack(s)) // ,
{
NoPrint(ma,e.seat); //
PopStack(s,e);
}
if(e.dir<4) //
{
e.dir++;
PushStack(s,e); // , ,
curpos=NextPos(e.seat,e.dir); //
}
}//if
}//else
}//while
return 0;
}
void DisplayMarkPath(MazeType maa) // ,
{
int i,j;
for(i=0;i
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.