1樓:啦啦啦小強
1、非遞迴方法
迷宮用陣列M[x]][y]表示,利用鏈棧儲存迷宮的路徑,從起始點開始壓入棧中,設方向為1向下走,令下一位置為當前位置,判斷當前位置是否為終點,若是,則退出返回1;否則,繼續判斷當前位置是否能通過,若能,繼續向下走;否則,令方向加1,在判斷,若方向加為4還是不能通過,則標誌當前位置不能通過,弾棧。(迷宮的得出利用隨機函式srand)
#include
#include
#include
#include
#define MAX 20
using namespace std;
typedef int Maze[MAX][MAX];
typedef struct
int x;//橫座標
int y;//縱座標
}PoseType;
typedef struct
int ord;//序號
PoseType seat;//座標
int di;//方向
}SElemType;
typedef struct SNode
SElemType data;
struct SNode *next;
}SNode,*SqStack;//鏈棧型別
bool InitStack(SqStack &S);
bool StackEmpty(SqStack S);
void Pop(SqStack &S,SElemType &e);
void Push(SqStack &S,SElemType e);
void CreatMaze(Maze &M,int m,int n);
void PrintMaze(Maze M,int m,int n);
bool MazePath(Maze &M,PoseType Start,PoseType End,SqStack &S);
void MarkPrint(Maze &M,PoseType P);
void PopPrint(SqStack S);
void NextPos(PoseType &curpos,int a);
bool Pass(Maze M,PoseType P);
void Creat(Maze &M,PoseType S,PoseType E,int m,int n);
void PrintMaze(Maze M,int m,int n);
bool InitStack(SqStack &S)
S=(SqStack)malloc(sizeof(SNode));
if(!S)exit (1);
S->next=NULL;
return 1;
}//初始化棧
bool StackEmpty(SqStack S)
if(S->next==NULL)return 1;
else return 0;
}//棧是否為空
void Pop(SqStack &S,SElemType &e)//弾棧
if(S->next==NULL)return;
SNode *p=S;
e=S->data;
delete p;
S=S->next;
void Push(SqStack &S,SElemType e)
SqStack q;
q=new SNode;
q->data=e;
q->next=S;
S=q;
}//壓棧
void CreatMaze(Maze &M,int m,int n)
srand((unsigned)time(NULL));
int i,j;
cout<<"輸入0表示無障礙,輸入1表示當前位置有障礙" i=0; if(i==0) for(j=0;jM[i][j]=1; i=m-1; if(i==m-1) for(j=0;jM[i][j]=1; j=0; if(j==0) for(i=0;iM[i][j]=1; j=m-1; if(j==m-1) for(i=0;iM[i][j]=1; }//建立迷宮 void Creat(Maze &M,PoseType S,PoseType E,int m,int n) int i=1,j=1; for(i=1;iwhile(M[i][j]==1) j++; if(j==n-1) M[i][S.y]=0;M[E.x][j-1];} for(j=1;jwhile(M[i][j]==1) i++; if(i==m-1) M[S.x][j]=0;M[i-1][E.y];} void PrintMaze(Maze M,int m,int n) system("color 5F"); //system("clear.exe") int i=0,j; for(i=0;ifor(j=0;jcout void FootPrint(Maze &M,PoseType curpos) M[curpos.x][curpos.y]=2; bool MazePath(Maze &M,PoseType Start,PoseType End,SqStack &S) int curstep,i,j; SElemType T; PoseType curpos; InitStack(S); curpos=Start;//將起始位置壓棧 curstep=1; doif(Pass(M,curpos)) FootPrint(M,curpos); T.ord=curstep; T.seat=curpos; T.di=1; Push(S,T); if(T.seat.x==End.x&&T.seat.y==End.y)return 1;//到終點則返回 NextPos(curpos,1);//1為向下走 curstep++; else if(!StackEmpty(S)) Pop(S,T); while(T.di==4&&!StackEmpty(S)) MarkPrint(M,T.seat);//標記不能通過 Pop(S,T); if(T.di<4) T.di++;//轉變方向 Push(S,T); curpos=T.seat; NextPos(curpos,T.di); }while(!StackEmpty(S)); return 0; void PopPrint(SqStack S) while(!StackEmpty(S)) cout<<"(" S=S->next; void NextPos(PoseType &curpos,int di)//下一步 if(di==1)curpos.x++;//1為向右走 else if(di==2)curpos.y++;//2為向下走 else if(di==3)curpos.x--;//3位向左走 else if(di==4)curpos.y--;//4為向上走 void MarkPrint(Maze &M,PoseType P) M[P.x][P.y]=1; }//上下左右都不能通過標誌為1 bool Pass(Maze M,PoseType P) if(M[P.x][P.y]==0)return 1; else return 0; }//是否能通過 int main() Maze M; PoseType Start,End; SqStack S; int MAX1,MAX2,a; cout<<"The longth is:"; cin>>MAX1;//迷宮的長 cout<<"The width is:"; cin>>MAX2;//迷宮的寬 CreatMaze(M,MAX1,MAX2); // PrintMaze(M,MAX1,MAX2); Start.x=1;Start.y=1; cout End.y=MAX2-2; Creat(M,Start,End,MAX1,MAX2); M[Start.x][Start.y]=M[End.x][End.y]=0; PrintMaze(M,MAX1,MAX2); if(MazePath(M,Start,End,S)==0)cout<<"沒有通路!"; else PopPrint(S); return 0; 2、遞迴實現方法 迷宮用陣列M[x]][y]表示,將每乙個能通過的陣列都記為步數,設定乙個關於方向的for迴圈,設定當前位置為起始位置,用for迴圈控制指向下一位置,若下一位置可通過且不是終點,則遞迴呼叫這個函式,若下一位置不可通過,則方向加1繼續進行,直到走到終點為止。 #include #include #define MAX 20 void PrintPath(int x,int y,int curstep); typedef int MazeType[MAX][MAX]; struct PosType int x; // 行值 int y; // 列值 struct PosType end; // 迷宮終點位置 MazeType m; // 迷宮陣列 int x, y; // 迷宮行數,列數 // 定義牆元素值為1,可通過路徑為0,通過路徑為足跡 // 輸出解 void Print(int x,int y) int i,j; for(i=0;ifor(j=0;jprintf("%3d",m[i][j]); printf("\n"); printf("\n"); void PrintPath(int x,int y,int curstep) int i,j,c=1; while(c<=curstep) for(i=1;ifor(j=1;j if(m[i][j]!=0&&m[i][j]!=1) printf("(%d,%d,%d)",i,j,curstep); c++; // 由當前位置cur、當前步驟curstep試探下一點 void MazePath(struct PosType cur,int curstep,int MAX1,int MAX2) int i; struct PosType next; // 下乙個位置 // struct PosType direc[4]=,,,}; // 移動方向,依次為東南西北 for(i=0;i<=3;i++) // 依次試探東南西北四個方向 next.x=cur.x+direc[i].x; next.y=cur.y+direc[i].y; if(m[next.x][next.y] == 0) // 是通路 m[next.x][next.y]=++curstep; if(next.x != end.x || next.y != end.y) // 沒到終點 MazePath(next,curstep,MAX1,MAX2); // 試探下一點(遞迴呼叫) else PrintPath(MAX1,MAX2,curstep); //Print(x,y); // 輸出結果 m[next.x][next.y]=0; // 恢復為通路,試探下一條路 curstep--; // 0為牆,-1為通道 int main() struct PosType start; //起點 int i,j,x1,y1; printf("請輸入迷宮的行數,列數(包括外牆):(空格隔開)"); scanf("%d%d",&x,&y); for(i=0;ifor(j=0;jm[i][j]=1; printf("請輸入迷宮通道個數:"); scanf("%d",&j); if(j) printf("請依次輸入迷宮內通道每個單元的行數,列數:(空格隔開)\n"); for(i=1;i<=j;i++) scanf("%d%d",&x1,&y1); m[x1][y1]=0; printf("迷宮結構如下:\n"); Print(x,y); printf("請輸入起點的行數,列數:(空格隔開)"); scanf("%d%d",&start.x,&start.y); printf("請輸入終點的行數,列數:(空格隔開)"); scanf("%d%d",&end.x,&end.y); m[start.x][start.y]=1; MazePath(start,1,x,y);// 由第一步起點試探起 return 0; 如果你的模數不是質數的話,請先拆成質數的整次冪。然後對於每乙個整次冪,用 exLucas 裡面提到的遞推方法解出在這一整次冪下的階乘結果。隨後只需要用 CRT 合併即可。由於題主沒有貼出模數,所以我沒法寫出更詳細的過程。 靜水流深MXY include intmain return0 墨黎 whil... 亂世 以前我也是這樣的,蹭著現在可以先接觸一下遊戲引擎方面的知識,現在主流的遊戲引擎是unity,適合做手機遊戲,單機遊戲,網路遊戲,指令碼語言為c 優點是學習簡單相對而言,對電腦效能要求低,手遊方面是主流,全平台遊戲都可以做。還有一些比較有名的遊戲引擎UE4,cocos creater。 泰勒柯西... 索特127 如果你需要編寫乙個給檔案分類的軟體的話,這個思路可能會幫到你 我講的是實現乙個在CLI下良好執行的檔案分類軟體,而不是在GUI的檔案管理器上執行 注意,這個思路並不能在沒有完整POSIX支援的Windows上完美實現 你需要實現乙個hash table,通過檔案路徑可以索引到乙個檔案及其...C 語言中如何盡量簡單地用 while 語句求 1 到 10 的階乘?
為什麼我用c 寫的遊戲那麼簡陋?
怎麼用c語言寫乙個檔案標籤系統?有什麼思路嗎?