資源簡介
數(shù)據(jù)結(jié)構(gòu)里的迷宮問題,從文件中讀取迷宮文件,然后得出解法,存入新的文件
代碼片段和文件信息
#include??
#include?
#include???
#include“string.h“
#define?MAX_SIZE?10?//迷規(guī)模?
#define?TRUE??1?
#define?FALSE??0?
#define?PASS??0?//通路?
#define?WALL??1?//障礙?
#define?IN???2?//入口?
#define?OUT???3?//出口?
#define?WAY???4?//路徑?
int?GQ=1;
typedef?struct?POINT?
{??
?int?xy;????//該點(diǎn)的坐標(biāo)?
?int?flag;????//方向標(biāo)記位?
}POINT;??
typedef?struct?MAZE?
{??int?maze[MAX_SIZE][MAX_SIZE];?//迷宮的各點(diǎn)的狀態(tài)?
???int?xy;??????//迷宮的行、列數(shù)?
???int?in_xin_y;?????//迷宮入口坐標(biāo)?
???int?out_xout_y;????//迷宮出口坐標(biāo)?
}MAZE;??
typedef?struct?STACK?{??
???POINT?road;??????//存放路徑信息?
???struct?STACK?*next;????//下一個路徑?
}STACK;?//鏈棧形式?
?
int?Meun(void);?
MAZE?*CreateMaze(void);?void?Show(MAZE?*);?
void?WriteFile(MAZE?*char?*);?
MAZE?*ReadFile(char?*);?
void?Quit(void);?
void?FindWay(MAZE?*);?
STACK?*InitStack(void);?
MAZE?*Push(STACK?*POINTMAZE?*);?
MAZE?*Pop(STACK?*MAZE?*);?
int?IsEmpty(STACK?*);?
POINT?GetTop(STACK);??
main()?{??
????MAZE?*G;
????int?choose;
????char?fname[10];??
????choose?=?Meun();
????char?tt;
????system(“cls“);
????switch(choose)
??????{??
??????case?1:
??????printf(“\n您有inA、inB、inC、inD四個迷宮選擇,請輸入你選擇的迷宮:“);?????
??????scanf(“%s“&fname);
??????G?=?ReadFile(fname);
??????printf(“文件中的迷宮如下:\n“);
??????Show(G);
??????printf(“入口為:(%d,%d)\n出口為:(%d,%d)\n“G->in_xG->in_yG->out_xG->out_y);
???????break;??????
??????case?2:exit(0);?
?????default:printf(“\n輸入的選項(xiàng)有誤!\n“);???????
?????exit(0);??}??
?????printf(“\n按任意鍵查看結(jié)果“);??
?????getch();??
?????system(“cls“);??
?????FindWay(G);??
?????free(G);??
?????printf(“\n按任意鍵繼續(xù)“);??
?????getch();??
?????system(“cls“);??
?????Quit();?}??
//取棧頂?
POINT?GetTop(STACK?s)?{??
??POINT?q;??
?q.x?=?q.y?=?-1;??
?q.flag?=?0;??
?q?=?s.next->road;??
?return?q;?}??
//判空?
int?IsEmpty(STACK?*s)?{??
if?(s->next?==?NULL)???return?TRUE;
??return?FALSE;?}??
//出棧操作?
MAZE?*Pop(STACK?*sMAZE?*G)?{??STACK?*t;??
?t?=?s->next;???//在出棧的同時讓該點(diǎn)的狀態(tài)回歸PASS??
?s->next?=?t->next;??
?G->maze[t->road.x][t->road.y]?=?PASS;??
?free(t);??
?return?G;?}??
//入棧操作?
MAZE?*Push(STACK?*sPOINT?pMAZE?*G)
{??STACK?*t;??
?t?=?(STACK?*)malloc(sizeof(STACK));??
?t->road?=?p;??
?t->next?=?s->next;??//在入棧的同時讓該點(diǎn)的狀態(tài)變?yōu)閃AY??
?s->next?=?t;??
?G->maze[p.x][p.y]?=?WAY;??
?return?G;?}??
//棧的初始化?
STACK?*InitStack(void)?{??
?STACK?*s;??
?s?=?(STACK?*)malloc(sizeof(STACK));??
?s->next?=?NULL;??return?s;?}??
//找出路?
void?FindWay(MAZE?*G)?{??
?STACK?*stack;??POINT?p;??
?stack?=?InitStack();??
?p.x?=?G->in_x;??//將入口坐標(biāo)入棧?
?p.y?=?G->in_y;??
?p.flag?=?0;??
?G?=?Push(stackpG);??
?do??{??
??switch(p.flag)???
????{???case?0:
?????????????if?(p.y+1?>=?0??&&??p.y+1?y??&&??G->maze[p.x][p.y+1]?==?PASS)???????
???????????????{????????
?????????stack->next->road.flag++;????????
?????????p.y?=?p.y?+?1;????????
?????????p.flag?=?0;???????
?????????G?=?Push(stackpG);??//嘗試向當(dāng)前坐標(biāo)的右邊走?
???????????????????break;???????
???????}???????else?stack->next->road.flag++;?
???????
評論
共有 條評論