您好,登錄后才能下訂單哦!
/***************************************************** WZ ASUST 2016 迷宮問題的兩種記錄形式 1:test11隊列 需要記錄后出隊列 2:test22棧實現 不需要彈出所記錄的坐標(僅無支路時) 第二種 不通過在循環中修改值的方法來展現路徑(但還是得先修改為1) 可以在最后 彈出元素并修改所經過的值為其他標識 在寫文檔中發現 有支路時,就得寫彈出部分的代碼 彈出無解的坐標 ****************************************************/ #include<iomanip>//操縱運算子 setw(2) // 內部矩陣大小 6*8 加邊框后是8*10 #define N 20 typedef int elem_type; class Stack { public: Stack() { top = 0; size = N; data = new elem_type[size]; } ~Stack() { top = 0; delete []data; data = NULL; } void IncSize() { size = 2*size; elem_type *p = new elem_type[size]; memcpy(p,data,sizeof(elem_type)*top); delete []data; data = p; } bool push(elem_type value) { if(isfull()) { IncSize(); } data[top++] = value; return true; } int gettop()//得到棧頂元素 { return data[--top]; } bool isfull()//判斷是否已滿 { return top == size; } private: elem_type* data; int top; int size; }; const int ExitX=6; const int ExitY=8; using namespace std; typedef struct QNode { int x,y; struct QNode *next; }QNode,Queueptr; typedef struct { Queueptr *front; Queueptr *rear; }LinkQueue; //初始化隊列 int InitQueue(LinkQueue &Q) { Q.front=Q.rear=(Queueptr*)malloc(sizeof(QNode)); if(!Q.front) return 0; Q.front->next=NULL; return 1; } //坐標x,y 入隊 int EnQueue(LinkQueue &Q,int x,int y) { Queueptr *p; p=(Queueptr*)malloc(sizeof(QNode)); if(!p) return 0; p->x=x; p->y=y; p->next=NULL; Q.rear->next=p; Q.rear=p; return 1; } //坐標x,y 出隊 int DeQueue(LinkQueue &Q,int *x,int *y) { Queueptr *p; p=Q.front->next; *x=p->x; *y=p->y; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); return 1; } int GetHead_x(LinkQueue Q,int *x) { *x=Q.front->next->x; return *x; } int GetHead_y(LinkQueue Q,int *y) { *y=Q.front->next->y; return *y; } int MAZE[8][10]={ 1,1,1,1,1,1,1,1,1,1, 1,0,0,0,1,1,1,1,1,1, 1,1,1,0,1,1,0,0,1,1, 1,1,1,0,1,1,0,0,1,1, 1,1,1,0,0,0,0,1,1,1, 1,1,1,1,1,1,0,1,1,1, 1,1,1,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1}; // 檢查是否走到出口 int chkExit(int x,int y,int ex,int ey) { if(x==ex && y==ey) return 1; else return 0; } int test11(){ int i,j; int x=1; //入口 int y=1; //入口 for(i=0;i<8;i++) { for(j=0;j<10;j++) cout<<setw(2)<<MAZE[i][j]<<" "; cout<<endl; } LinkQueue Q; InitQueue(Q); MAZE[x][y]=1; //入口標記為1 EnQueue(Q,x,y); // while(1) { x=GetHead_x(Q,&x); y=GetHead_y(Q,&y); if(chkExit(x,y,ExitX,ExitY)==1) break; else{ if(MAZE[x-1][y]==0) { MAZE[x-1][y]=MAZE[x][y]+1; EnQueue(Q,(x-1),y); } if(MAZE[x+1][y]==0) { MAZE[x+1][y]=MAZE[x][y]+1; EnQueue(Q,(x+1),y); } if(MAZE[x][y-1]==0) { MAZE[x][y-1]=MAZE[x][y]+1; EnQueue(Q,x,(y-1)); } if(MAZE[x][y+1]==0) { MAZE[x][y+1]=MAZE[x][y]+1; EnQueue(Q,x,(y+1)); } else { DeQueue(Q,&x,&y); } } } cout<<"[test11 所求最短路徑!]"<<endl; for(i=0;i<8;i++) { for(j=0;j<10;j++) cout<<setw(2)<<MAZE[i][j]<<" "; cout<<endl; } return 0; } int test22() { int i,j; int x=1; //入口 int y=1; //入口 for(i=0;i<8;i++) { for(j=0;j<10;j++) cout<<setw(2)<<MAZE[i][j]<<" "; cout<<endl; } Stack s;//建立一個棧 MAZE[x][y]=1; //入口標記為1 s.push(x); s.push(y); MAZE[x][y]=1; //入口標記為1 s.push(x); s.push(y); while(1) { y=s.gettop(); x=s.gettop(); if(chkExit(x,y,ExitX,ExitY)==1) break; else{ if(MAZE[x-1][y]==0) { MAZE[x-1][y]=MAZE[x][y]+1; s.push(x-1); s.push(y); } if(MAZE[x+1][y]==0) { MAZE[x+1][y]=MAZE[x][y]+1; s.push(x+1); s.push(y); } if(MAZE[x][y-1]==0) { MAZE[x][y-1]=MAZE[x][y]+1; s.push(x); s.push(y-1); } if(MAZE[x][y+1]==0) { MAZE[x][y+1]=MAZE[x][y]+1; s.push(x); s.push(y+1); } } } cout<<"[ test22 所求最短路徑!]"<<endl; for(i=0;i<8;i++) { for(j=0;j<10;j++) cout<<setw(2)<<MAZE[i][j]<<" "; cout<<endl; } return 0; } void newMAZE1() { time_t t; srand((unsigned)time(&t)); int k=0; int r,l; while(k<20) { r=rand()%8; l=rand()%10; if(MAZE[r][l]!=0) { MAZE[r][l]=0;k++;} } } void newMAZE() { int k=0; while(k<8) { MAZE[k][1]=0;k++; } k=0; while(k<10) { MAZE[6][k]=0;k++; } } int main() { test11(); cout<<endl; newMAZE(); cout<<endl; test22(); return 0; } //修bug中
棧實現基本都可以 走到支路 然后給支路置1 記錄一個棧長度 然后從新再來 得到新的棧 若短就更新棧 最后沒有路時就比較 是否有解 有解取最短棧就是最優解
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。