迷宫问题源代码

合集下载

栈的应用-迷宫问题-数据结构(C语言版)-源代码(直接运行)

栈的应用-迷宫问题-数据结构(C语言版)-源代码(直接运行)

#include <stdio.h>#include <stdlib.h>#include <string.h>#define STACK_INIT_SIZE 100#define INCREMENT 10typedef struct{int r;int c;}zuobiao;typedef struct{int ord; //在当前坐标上的“标号”zuobiao seat; //坐标int di; //走向下一通道的方向}lujing;typedef struct{int sz[10][10];}Maze;typedef struct SqStack{lujing *base;lujing *top;int size;}SqStack;int initStack(SqStack *s){s->base = (lujing *)malloc(STACK_INIT_SIZE*sizeof(lujing) );if(!s->base)return -1;s->top = s->base;s->size = STACK_INIT_SIZE;return 0;}int push(SqStack *s, lujing e){if(s->top - s->base >= s->size){s->base = (lujing *)realloc(s->base, (s->size+INCREMENT)*sizeof(lujing));if(!s->base)return -1;s->top = s->base+s->size;s->size += INCREMENT;}*s->top++ = e;return 0;}int pop(SqStack *s,lujing *e){if(s->top == s->base)return -1;*e = *(--s->top);return 0;}int isEmpty(SqStack *s){if(s->base == s->top)return 1;elsereturn 0;}int pass( Maze maze,zuobiao dqzb) {if (maze.sz[dqzb.r][dqzb.c]==1)return 1; // 如果当前位置是可以通过,返回1else return 0; // 否则返回0}void footPrint(Maze &maze,zuobiao dqzb) {maze.sz[dqzb.r][dqzb.c]=9;}void markPrint(Maze &maze,zuobiao dqzb) {maze.sz[dqzb.r][dqzb.c]=4;}zuobiao nextPos(zuobiao dqzb, int Dir) {zuobiao xzb;switch (Dir) {case 1:xzb.r=dqzb.r;xzb.c=dqzb.c+1;break;case 2:xzb.r=dqzb.r+1;xzb.c=dqzb.c;break;case 3:xzb.r=dqzb.r;xzb.c=dqzb.c-1;break;case 4:xzb.r=dqzb.r-1;xzb.c=dqzb.c;break;}return xzb;}int mazePath(Maze &maze, zuobiao start, zuobiao end){SqStack *s = (SqStack *)malloc(sizeof(SqStack));initStack(s);zuobiao dqzb = start; // 设定"当前位置"为"入口位置"lujing e;int curstep = 1; // 探索第一步do {if (pass(maze,dqzb)) { // 当前位置可通过,即是未曾走到过的通道块footPrint(maze,dqzb); // 留下足迹e.di =1;e.ord = curstep;e.seat= dqzb;push(s,e); // 加入路径if (dqzb.r == end.r && dqzb.c==end.c)return 0; // 到达终点(出口)dqzb = nextPos(dqzb, 1); // 下一位置是当前位置的东邻curstep++; // 探索下一步} else { // 当前位置不能通过if (!isEmpty(s)) {pop(s,&e);while (e.di==4 && !isEmpty(s)) {markPrint(maze,e.seat);pop(s,&e); // 留下不能通过的标记,并退回一步}if (e.di<4) {e.di++; // 换下一个方向探索push(s, e);dqzb = nextPos(e.seat, e.di); // 当前位置设为新方向的相邻块}}}} while (!isEmpty(s) );return -1;}void main(){printf(" *----Δ迷宫求解Δ----*\n\n");printf("---迷宫如下所示:(说明:0表示墙;1表示可以通过)");printf("\n");Maze maze; //声明mazemaze.sz[0][0]= 0;maze.sz[0][1]= 0;maze.sz[0][2]= 0;maze.sz[0][3]= 0;maze.sz[0][4]= 0;maze.sz[0][5]= 0;maze.sz[0][6]= 0;maze.sz[0][7]= 0;maze.sz[0][8]= 0;maze.sz[0][9]= 0;maze.sz[1][0]= 0;maze.sz[1][1]= 1;maze.sz[1][2]= 1;maze.sz[1][3]= 0;maze.sz[1][4]= 1;maze.sz[1][5]= 1;maze.sz[1][6]= 1;maze.sz[1][7]= 0;maze.sz[1][8]= 1;maze.sz[1][9]= 0;maze.sz[2][0]= 0;maze.sz[2][1]= 1;maze.sz[2][2]= 1;maze.sz[2][3]= 0;maze.sz[2][4]= 1;maze.sz[2][5]= 1;maze.sz[2][6]= 1;maze.sz[2][7]= 0;maze.sz[2][8]= 1;maze.sz[2][9]= 0;maze.sz[3][0]= 0;maze.sz[3][1]= 1;maze.sz[3][2]= 1;maze.sz[3][3]= 1;maze.sz[3][4]= 1;maze.sz[3][5]= 0;maze.sz[3][6]= 0;maze.sz[3][7]= 1;maze.sz[3][8]= 1;maze.sz[3][9]= 0;maze.sz[4][0]= 0;maze.sz[4][1]= 1;maze.sz[4][2]= 0;maze.sz[4][3]= 0;maze.sz[4][4]= 0;maze.sz[4][5]= 1;maze.sz[4][6]= 1;maze.sz[4][7]= 1;maze.sz[4][8]= 1;maze.sz[4][9]= 0;maze.sz[5][0]= 0;maze.sz[5][1]= 1;maze.sz[5][2]= 1;maze.sz[5][3]= 1;maze.sz[5][4]= 0;maze.sz[5][5]= 1;maze.sz[5][6]= 1;maze.sz[5][7]= 0;maze.sz[5][8]= 1;maze.sz[5][9]= 0;maze.sz[6][0]= 0;maze.sz[6][1]= 1;maze.sz[6][2]= 0;maze.sz[6][3]= 1;maze.sz[6][4]= 1;maze.sz[6][5]= 1;maze.sz[6][6]= 0;maze.sz[6][7]= 1;maze.sz[6][8]= 1;maze.sz[6][9]= 0;maze.sz[7][0]= 0;maze.sz[7][1]= 1;maze.sz[7][2]= 0;maze.sz[7][3]= 0;maze.sz[7][4]= 0;maze.sz[7][5]= 1;maze.sz[7][6]= 0;maze.sz[7][7]= 0;maze.sz[7][8]= 1;maze.sz[7][9]= 0;maze.sz[8][0]= 0;maze.sz[8][1]= 0;maze.sz[8][2]= 1;maze.sz[8][3]= 1;maze.sz[8][4]= 1;maze.sz[8][5]= 1;maze.sz[8][6]= 1;maze.sz[8][7]= 1;maze.sz[8][8]= 1;maze.sz[8][9]= 0;maze.sz[9][0]= 0;maze.sz[9][1]= 0;maze.sz[9][2]= 0;maze.sz[9][3]= 0;maze.sz[9][4]= 0;maze.sz[9][5]= 0;maze.sz[9][6]= 0;maze.sz[9][7]= 0;maze.sz[9][8]= 0;maze.sz[9][9]= 0;int i,j,sum;for (i = 0; i < 10; i++) {for (j = 0; j < 10; j++){printf("%4d",maze.sz[i][j]);sum++;}if(sum%10==0)printf("\n");}printf("\n");printf("---请输入1求解路径图:");int a;scanf("%d",&a);if(a==1){zuobiao rukou,chukou;rukou.r=1;rukou.c=1;chukou.r=8;chukou.c=8;mazePath(maze,rukou,chukou);printf("\n");printf("---图解如下所示:(说明:0表示墙;1表示可以通过;4表示走不通;9表示所走的路径)\n");for (i = 0; i < 10; i++) {for (j = 0; j < 10; j++){printf("%4d",maze.sz[i][j]);sum++;}if(sum%10==0)printf("\n");}}}。

数据结构迷宫问题源代码

数据结构迷宫问题源代码

#include<stdio.h>#include<stdlib.h>#include"Status.h"typedef struct{int x;int y;}posType;typedef struct{posType pos;int dirc;}SElemType;#include"SqStack.h"#define Row 12#define Col 12posType nextPos(posType curPos,int d){posType pos;switch(d){case 1: pos.x=curPos.x;pos.y=curPos.y+1;break;case 2: pos.x=curPos.x+1;pos.y=curPos.y;break;case 3: pos.x=curPos.x;pos.y=curPos.y-1;break;case 4: pos.x=curPos.x-1;pos.y=curPos.y;break;}return pos;}Status canGo(posType pos,int M[Row][Col]){if(M[pos.x][pos.y]==0) return TRUE;else return FALSE;}Status Maze(int M[Row][Col],posType start,posType end){ SqStack S;SElemType e;posType curPos;int d,step;InitSqStack(&S,100);curPos=start;d=4;do{if(canGo(curPos,M)){M[curPos.x][curPos.y]=2;e.pos=curPos;e.dirc=d;Push(&S,e);if(curPos.x==end.x&&curPos.y==end.y) break;d=1;curPos=nextPos(curPos,d);}else if(d<4){d++;getTop(S,&e);curPos=nextPos(e.pos,d);}else if(!stackIsEmpty(S)){Pop(&S,&e);d=e.dirc;curPos=e.pos;}}while(!stackIsEmpty(S));if(!stackIsEmpty(S)){Pop(&S,&e);M[e.pos.x][e.pos.y]='e';d=e.dirc;for(step=stackLength(S);step>0;step--){Pop(&S,&e);switch(d){case 1: M[e.pos.x][e.pos.y]=26;break;case 2: M[e.pos.x][e.pos.y]=25;break;case 3: M[e.pos.x][e.pos.y]=27;break;case 4: M[e.pos.x][e.pos.y]=24;break;}d=e.dirc;}M[start.x][start.y]='s';return TRUE;}else return FALSE;}void printMaze(int M[Row][Col],posType start,posType end){int i,j;printf("迷宫:入口(%d,%d),出口(%d,%d)\n",start.x,start.y,end.x,end.y); printf("\t%3c",' ');for(i=0;i<Col;i++)printf("%2d ",i);printf("\n");for(i=0;i<Row;i++){printf("\t%2d",i);for(j=0;j<Col;j++){if(M[i][j]==1)printf("|||");else if(M[i][j]==0)printf(" ");else if(M[i][j]==2)printf(" = ");else printf(" %c",M[i][j]);}printf("\n");}printf("\n");}int main(){int M[Row][Col]={{1,1,1,1,1,1,1,1,1,1,1,1},{1,0,0,0,1,1,0,1,1,1,0,1},{1,0,1,0,0,1,0,0,1,0,0,1},{1,0,1,1,0,0,0,1,1,0,1,1},{1,0,0,1,0,1,0,0,0,0,0,1},{1,1,0,1,0,1,1,0,1,0,1,1},{1,0,0,1,0,0,0,0,1,1,1,1},{1,0,1,0,1,1,1,1,0,0,1,1},{1,0,0,0,0,1,1,0,0,0,1,1},{1,0,1,0,1,0,0,0,1,0,0,1},{1,0,0,0,0,0,1,0,0,1,0,1},{1,1,1,1,1,1,1,1,1,1,1,1} };posType start,end;start.x=1;start.y=1;end.x=10;end.y=10;printMaze(M,start,end);if(Maze(M,start,end)){printf("找到可行路径:\n");printMaze(M,start,end);}else printf("无可行路径!\n");system("pause");return 0;}。

数据结构迷宫源代码

数据结构迷宫源代码

数据结构迷宫源代码数据结构迷宫源代码1.引言在计算机科学中,数据结构是一种组织和存储数据的方式,能够有效地使用和操作这些数据。

迷宫是一种经典的问题,通过使用数据结构,我们可以有效地表示和解决迷宫问题。

本文将介绍如何使用数据结构来表示和解决迷宫问题,并提供相应的源代码。

2.迷宫的定义与表示迷宫可以被定义为一个二维的网格,其中的每个单元格可以是通路或墙壁。

我们可以使用二维数组来表示迷宫,其中的每个元素可以被设定为0代表墙壁,1代表通路。

以下是一个迷宫的示例: ```int[][] maze = {{0, 0, 0, 0, 0},{1, 1, 0, 1, 0},{0, 1, 0, 0, 0},{0, 1, 1, 1, 1},{0, 0, 0, 0, 0}}。

```3.迷宫求解算法3.1 深度优先搜索算法深度优先搜索算法是一种递归的算法,它会尽可能地深入到迷宫中的某个通路,直到无法继续深入为止。

然后回溯到上一个分支点,继续搜索其他的分支。

以下是深度优先搜索算法的代码: ```void dfs(int[][] maze, int row, int col) {// 标记当前位置为已经访问过maze[row][col] = .1。

// 检查周围的四个方向int[] dx = {.1, 1, 0, 0}。

int[] dy = {0, 0, .1, 1}。

for (int i = 0。

i < 4。

i++) {int newRow = row + dx[i]。

int newCol = col + dy[i]。

// 检查新位置是否合法并且是通路if (newRow >= 0 && newRow < maze.length && newCol >= 0 && newCol < maze[0].length &&maze[newRow][newCol] == 1) {dfs(maze, newRow, newCol)。

迷宫程序源代码

迷宫程序源代码

#include"stdio.h"#include"stdlib.h"#define M1 11#define N1 11 /*M1*N1为加上围墙后的迷宫大小*/#define MAX 100 /*定义栈的最大长度*/int M=M1-2;int N=N1-2; /*M*N为原迷宫大小*/typedef struct /*定义栈元素的类型*/{int x,y,dir;}elemtype;typedef struct /*定义顺序栈*/{elemtype stack[MAX];int top;}P;struct moved /*定义方向位移数组的类型*/{int dx;int dy;};void Newmg(int mg[M1][N1]) /*迷宫的初始化*/{int i,j,num;printf("迷宫:\n");for (i=1;i<=M;i++){for (j=1;j<=N;j++){num=(800*(i+j)+1500)%327; /*根据N和M值伪随机产生迷宫*/if((num<150)&&(i!=M||j!=N))mg[i][j]=1;elsemg[i][j]=0;printf("%3d",mg[i][j]);} /*输出迷宫*/printf("\n");}printf("\n");for(i=0;i<=M+1;i++) /*设置迷宫的围墙*/{mg[i][0]=1;mg[i][N+1]=1;}for(j=0;j<=N+1;j++)mg[0][j]=1;mg[N+1][j]=1;}}void Newmove(struct moved move[8]) /*定义存储坐标变量的方向位移*/ {move[0].dx=0;move[0].dy=1; /*寻找方向依次为:东,东南,南,move[1].dx=1;move[1].dy=1; 西南,西,西北,北,东北*/ move[2].dx=1;move[2].dy=0;move[3].dx=1;move[3].dy=-1;move[4].dx=0;move[4].dy=-1;move[5].dx=-1;move[5].dy=-1;move[6].dx=-1;move[6].dy=0;move[7].dx=-1;move[7].dy=1;}void Newstack(P *s) /*初始化栈*/{s->top=-1;}int RuZhan(P *s ,elemtype x) /*将数据元素x压入指针s所指的栈中*/ {if (s->top==MAX-1)return (0); /*如栈满,即压栈失败,则返回0*/ else{s->stack[++s->top]=x;return(1); /*压栈成功,则返回1*/}}elemtype ChuZhan(P *s) /*栈顶元素出栈*/{elemtype elem;if (s->top<0) /*如果栈空,返回空值*/{elem.x=NULL;elem.y=NULL;elem.dir=NULL;return(elem);}elses->top--;return(s->stack[s->top+1]); /*如果栈非空,返回栈顶元素*/}}void Search(int mg[M1][N1],struct moved move[8],P *s){ /*寻找迷宫的通路*/int i,j,dir,x,y,k;elemtype elem;i=1;j=1;dir=0;mg[1][1]=-1; /*设置(1,1)为入口处*/do{x=i+move[dir].dx; /*寻找下一步可行的到达点的坐标*/y=j+move[dir].dy;if(mg[x][y]==0){elem.x=i;elem.y=j;elem.dir=dir;k=RuZhan(s,elem); /*如果可通过,将此点数据压栈*/if(k==0)printf("栈长度太短\n"); /*如果入栈操作返回0,说明栈容量不够*/i=x;j=y;dir=0;mg[x][y]=-1;}else if(dir<7)dir++;else /*如果八个方向都不可行,就退回一步*/ {elem=ChuZhan(s);if (elem.x!=NULL){i=elem.x;j=elem.y;dir=elem.dir+1;}}}while (!((s->top==-1)&&(dir>=7)||(x==M)&&(y==N)));/*循环,直到入口处或出口处为止*/if(s->top==-1) /*如果最终是入口处,则迷宫无通路*/printf("此迷宫无通路\n");else{elem.x=x;elem.y=y;elem.dir=dir;k=RuZhan(s,elem); /*将最后出口的坐标压入栈中*/printf("迷宫通路:\n");printf (" 入口->");i=0;while (i<=s->top){printf("(%d,%d)->",s->stack[i].x,s->stack[i].y); /*显示迷宫通路*/ if(i!=s->top)if((i+1)%4==0)printf("\n");i++;}printf ("出口\n");}}void main() /*寻找迷宫通路程序*/{P *s;int mg[M1][N1];struct moved move[8];Newmg (mg); /*调用函数初始化迷宫*/s=(P*)malloc(sizeof(P));Newstack(s); /*调用函数初始化栈*/Newmove(move); /*调用函数初始化位移数组*/ Search (mg,move,s); /*调用函数寻找迷宫通路*/}。

迷宫问题源代码

迷宫问题源代码

#include<malloc.h>#include<time.h>#include<iostream>#include<stdlib.h>#include<stdio.h>#define M 50#define N 50typedef struct node //堆栈结构{int row; //行int col; //列struct node *next;}Mlink;Mlink *stack;//定义一个栈int backup[M+2][N+2]; //备份数组/*********************************建立迷宫矩阵**************************/void create(int maze[][N+2],int a,int b)//建立迷宫{int i,j,flag;srand((unsigned)time(NULL)); //以时间产生随机种子for(i=0;i<=a+1;i++)for(j=0;j<=b+1;j++)maze[i][j]=1;//将四周置为1for(i=1;i<=a;i++)for(j=1;j<=b;j++){maze[i][j]=0;//初始化矩阵backup[i][j]=0;//初始化备份矩阵}牰湩晴尨建立迷宫矩阵(选择1或者2):\n1,手动建立\n2,自动建立\n请输入您的选择:\n); scanf(%d,&flag);if(flag==1)//手动建立迷宫{牰湩晴尨手动建立迷宫矩阵(0表示可通1表示障碍):\n);for(i=1;i<=a;i++)for(j=1;j<=b;j++)scanf(%d,&maze[i][j]);}if(flag==2){ //自动建立迷宫int c,i1,j1;for(c=1;c<=a*b;c++){ //矩阵初始为“0”,随机选择位置赋予一个随机的0或1,i1=(int)(rand()%a)+1;j1=(int)(rand()%b)+1;maze[i1][j1]=(int)(rand()%2); //随机矩阵这样可以产生更多的“0”即通路}牰湩晴尨自动生成中……\n);system (pause);}for(i=1;i<=a;i++)for(j=1;j<=a;j++)backup[i][j]=maze[i][j];//备份数组矩阵}//********************************打印迷宫矩阵*******************void prin(int maze[][N+2],int a,int b){int i,j,z;牰湩晴尨迷宫矩阵如下(0可通):\n );for(z=1;z<=b;z++) //在矩阵上方标明列号{if(z<10)printf(%d ,z);elseprintf(%d ,z);}for(i=1;i<=a;i++){printf(\);if(i<10)printf(%d ,i); //矩阵左方标明行号elseprintf(%d ,i);for(j=1;j<=b;j++)printf(%d ,maze[i][j]);printf(\迷宫图形如下(白色可通):\n);printf( );for(z=1;z<=b;z++) //在图形上方标明列号{if(z<10)printf(%d ,z);elseprintf(%d,z);}for(i=1;i<=a;i++){printf(\);if(i<10)printf(%d ,i); //矩阵左方标明行号elseprintf(%d,i);for(j=1;j<=b;j++){if(maze[i][j]==0)牰湩晴尨□);if(maze[i][j]==1)牰湩晴尨■);}}}/*******************************分割线***************************/int Mazepath(int maze[][N+2],int x1,int x2,int y1,int y2){Mlink *p;if(maze[x1][y1]==0){p=(Mlink *)malloc(sizeof(Mlink));p->row=x1;p->col=y1;p->next=NULL;stack=p; //将入口放入堆栈maze[stack->row][stack->col]=1;//标志入口已访问while((!(stack->row==NULL&&stack->col==NULL))&&(!(stack->row==x2&&stack->col= =y2)))//未找到出口并且堆栈不空{if(maze[stack->row+1][stack->col]==0) //下面可通{p=(Mlink *)malloc(sizeof(Mlink));p->row=stack->row+1;p->col=stack->col;p->next=stack; //入栈stack=p;maze[stack->row][stack->col]=1; //标记已访问}else if(maze[stack->row][stack->col+1]==0) //右面位置可通{p=(Mlink *)malloc(sizeof(Mlink));p->row=stack->row;p->col=stack->col+1;p->next=stack; //入栈stack=p;maze[stack->row][stack->col]=1;//标记已访问}else if(maze[stack->row-1][stack->col]==0) //左面可通{p=(Mlink *)malloc(sizeof(Mlink));p->row=stack->row-1;p->col=stack->col;p->next=stack; //入栈stack=p;maze[stack->row][stack->col]=1;//标记已访问}else if(maze[stack->row][stack->col-1]==0)//上面可通{p=(Mlink *)malloc(sizeof(Mlink));p->row=stack->row;p->col=stack->col-1;p->next=stack; //入栈stack=p;maze[stack->row][stack->col]=1;//标记已访问}else //不可通返回上一点{if (stack->next!=NULL){ //堆栈里布置一个顶点则出栈并返回循环p=stack;stack=stack->next; //出栈free(p); //释放空间}else //堆栈里只有一个顶点即入口,此时若释放空间出栈会使循环{ //控制语句无法比较(因为stack->col,stack->row都已不存在,) stack->row=NULL;stack->col=NULL;stack->next=NULL;}}}if (stack->row==x2&&stack->col==y2) return (1);else return (0);}else return(0);}/****************************输出坐标通路*******************/void printonglu1(){Mlink *q;int i=1;牰湩晴尨其中的一条通道为:\n);q=stack;printf( 出口<--);while (q!=NULL){if(i%5==0)printf(\);printf([%d=]<--,q->row,q->col);q=q->next;i++;}牰湩晴尨入口\n);}/*******************************分割线**********************//**********************输出图形通路**************************///2时输出↑,3时输出←,4时输出→,5时输出↓void printonglu2(int a,int b){牰湩晴尨图形通路如下:\n);int z;printf( );for(z=1;z<=b;z++) //图形上方标明列号{if(z<10)printf(%d ,z);elseprintf(%d,z);}int i,j;Mlink *p;p=stack;backup[p->row][p->col]=6;while (p->next!=NULL){if(p->next->col!=NULL){if( p->row > p->next->row ) backup[p->next->row][p->next->col]=5;//下一节点在下else if(p->row<p->next->row) backup[p->next->row][p->next->col]=2;//下一节点在上else if(p->col>p->next->col) backup[p->next->row][p->next->col]=4;//下一节点在右else backup[p->next->row][p->next->col]=3;//下一节点在左}else ;p=p->next;}for(i=1;i<=a;i++){printf(\);if(i<10) printf(%d ,i); //图形左方标明行号else printf(%d,i);for(j=1;j<=b;j++){if(backup[i][j]==0)牰湩晴尨□);if(backup[i][j]==1)牰湩晴尨■);if(backup[i][j]==2)牰湩晴尨↑);if(backup[i][j]==3)牰湩晴尨←);if(backup[i][j]==4)牰湩晴尨→);if(backup[i][j]==5)牰湩晴尨↓);if(backup[i][j]==6)牰湩晴尨㊣);}}}//***********************************************************void main(){system(color f0); //背景为白色int k=1,a,b;int maze[M+2][N+2];//迷宫矩阵int abc[M+2][N+2],p,q; //备份数组以重复使用迷宫牰湩晴尨建立迷宫!!!\n);牰湩晴尨输入迷宫矩阵的行列数M,N!!!\n);scanf(%d%d,&a,&b);create(maze,a,b); //建立迷宫for(p=0;p<=a+2;p++)for(q=0;q<=b+2;q++)abc[p][q]=maze[p][q];while(k!=0){int x,x1,x2,y1,y2;prin(maze,a,b); //打印迷宫矩阵printf(\输入迷宫入口:\n);scanf(%d%d,&x1,&y1);牰湩晴尨输入迷宫出口:\n);scanf(%d%d,&x2,&y2);x=Mazepath(maze,x1,x2,y1,y2);if(x==1) //迷宫可通{printonglu1(); //打印坐标通路printonglu2(a,b);//打印图形通路printf(\);}else牰湩晴尨无通路!\n);//不可通for(p=0;p<=a+2;p++)for(q=0;q<=b+2;q++){backup[p][q]=abc[p][q];maze[p][q]=abc[p][q];}牰湩晴尨输入0结束:\n);scanf(%d,&k);}}。

迷宫求解完整代码

迷宫求解完整代码

迷宫求解完整代码3.本程序包括三个模块1) 主程序模块:void main(){初始化;do{接受命令;处理命令;}while(命令!=”退出”);}2) 栈模块------实现栈的抽象数据类型 3)迷宫模块----实现迷宫抽象数据类型各个模块之间的调用关系如下:主程序模块->迷宫模块 ->栈模块三( 详细设计1. 坐标位置类型typedef struct PosType //定义坐标 {int x; //当前横坐标int y; //当前纵坐标 }PosType;2.迷宫类型int Maze[][];//迷宫存放在一个数字型数组中int MazePath(int maze[N][N],PosType start,PosType end,LinkStack&stack,int n1,int n2)//求解迷宫maze中,从入口Start到出口end的一条路径{stack=NULL;SElemType e;PosType curpos;InitStack(stack);//初始化stackcurpos.x=start.x; //设定当前位置为入口位置curpos.y=start.y;int curstep=1; //探索第一步do{if(Pass(curpos,maze,n1,n2)==1)//当前位置可通{FootPrint(curpos,maze); //留下足迹e.ord=curstep;e.seat.x=curpos.x;e.seat.y=curpos.y;e.di=1;Push(stack,e); //加入路径,入栈if(curpos.x==end.x&&curpos.y==end.y) //到达出口位置return 1;elseNextPos(curpos,1); //探索下一步curstep++;}//ifelse //当前位置不能通过{if(!StackEmpty(stack)){Pop(stack,e);while(e.di==4&&!StackEmpty(stack)){MarkPrint(e.seat,maze);//留下不能通过的标记,并退回一步Pop(stack,e);}//while}if(e.di<4) //换下一个方向探索{e.di++;Push(stack,e);NextPos(e.seat,e.di); //设当前位置是该新方向上的相邻块,1代表向右,2代表向下,3代表向左,4代表向上。

c语言走迷宫代码

c语言走迷宫代码

c语言走迷宫代码以下是一个简单的 C 语言走迷宫代码示例,使用了递归算法: ```c#include <stdio.h>#include <stdlib.h>int main() {int size, row, col, choice, i, j;maze[0][0] = "*";maze[1][0] = "O";maze[0][1] = "O";maze[1][1] = "*";size = 2;row = 2;col = 2;while (1) {printf("Enter row: ");scanf("%d", &row);printf("Enter col: ");scanf("%d", &col);if (row < 0 || row > size || col < 0 || col > size) { printf("Invalid row or col. Try again.");}if (maze[row][col] != "*") {printf("Current cell is free. Try again. ");continue;}maze[row][col] = "X";printf("Enter a choice (1-6): ");scanf("%d", &choice);switch (choice) {case 1:row++;col = 0;break;case 2:row--;col = 0;break;case 3:col++;break;col--;break;case 5:row--;col = 1;break;case 6:row++;col = 1;break;default:printf("Invalid choice. Try again. ");continue;}}printf(" maze: ");for (i = 0; i < size * size; i++) { for (j = 0; j < size; j++) {if (maze[i][j] == "*")printf("*");elseprintf("%c", maze[i][j]);}printf("");}return 0;}```该程序首先初始化了一个 2x2 的迷宫,其中 `maze[0][0]` 和`maze[1][0]` 分别标记为 `"O"` 和 `"*"`,其他地方都为空。

迷宫python代码

迷宫python代码

迷宫python代码当然,下面是一个简单的迷宫求解的Python代码示例: python.# 定义迷宫。

maze = [。

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],。

[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],。

[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],。

[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],。

[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],。

[1, 0, 0, 0, 1, 0, 0, 1, 0, 1],。

[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],。

[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],。

[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],。

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ]# 定义迷宫的大小。

n = len(maze)。

m = len(maze[0])。

# 定义四个方向的移动。

dx = [-1, 1, 0, 0]dy = [0, 0, -1, 1]# 定义一个函数用于求解迷宫。

def solve(x, y):# 如果到达终点,则返回True. if x == n-1 and y == m-1:return True.# 标记当前位置已经访问过。

maze[x][y] = 2。

# 尝试四个方向的移动。

for i in range(4):nx = x + dx[i]ny = y + dy[i]# 判断新位置是否合法。

if 0 <= nx < n and 0 <= ny < m and maze[nx][ny] == 0:# 递归求解新位置。

if solve(nx, ny):return True.# 如果四个方向都无法到达终点,则返回False.return False.# 调用函数求解迷宫。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<malloc.h>#include<time.h>#include<iostream>#include<stdlib.h>#include<stdio.h>#define M 50#define N 50typedef struct node //堆栈结构{int row; //行int col; //列struct node *next;}Mlink;Mlink *stack;//定义一个栈int backup[M+2][N+2]; //备份数组/*********************************建立迷宫矩阵**************************/void create(int maze[][N+2],int a,int b)//建立迷宫{int i,j,flag;srand((unsigned)time(NULL)); //以时间产生随机种子for(i=0;i<=a+1;i++)for(j=0;j<=b+1;j++)maze[i][j]=1;//将四周置为1for(i=1;i<=a;i++)for(j=1;j<=b;j++){maze[i][j]=0;//初始化矩阵backup[i][j]=0;//初始化备份矩阵}printf("建立迷宫矩阵(选择1或者2):\n1,手动建立\n2,自动建立\n请输入您的选择:\n");scanf("%d",&flag);if(flag==1)//手动建立迷宫{printf("手动建立迷宫矩阵(0表示可通1表示障碍):\n");for(i=1;i<=a;i++)for(j=1;j<=b;j++)scanf("%d",&maze[i][j]);}if(flag==2){ //自动建立迷宫int c,i1,j1;for(c=1;c<=a*b;c++){ //矩阵初始为“0”,随机选择位置赋予一个随机的0或1,i1=(int)(rand()%a)+1;j1=(int)(rand()%b)+1;maze[i1][j1]=(int)(rand()%2); //随机矩阵这样可以产生更多的“0”即通路}printf("自动生成中……\n");system ("pause");}for(i=1;i<=a;i++)for(j=1;j<=a;j++)backup[i][j]=maze[i][j];//备份数组矩阵}//********************************打印迷宫矩阵*******************void prin(int maze[][N+2],int a,int b){int i,j,z;printf("迷宫矩阵如下(0可通):\n ");for(z=1;z<=b;z++) //在矩阵上方标明列号{if(z<10)printf("%d ",z);elseprintf("%d ",z);}for(i=1;i<=a;i++){printf("\n");if(i<10)printf("%d ",i); //矩阵左方标明行号elseprintf("%d ",i);for(j=1;j<=b;j++)printf("%d ",maze[i][j]);}printf("\n迷宫图形如下(白色可通):\n");printf(" ");for(z=1;z<=b;z++) //在图形上方标明列号{if(z<10)printf("%d ",z);elseprintf("%d",z);}for(i=1;i<=a;i++){printf("\n");if(i<10)printf("%d ",i); //矩阵左方标明行号elseprintf("%d",i);for(j=1;j<=b;j++){if(maze[i][j]==0)printf("□");if(maze[i][j]==1)printf("■");}}}/*******************************分割线***************************/int Mazepath(int maze[][N+2],int x1,int x2,int y1,int y2){Mlink *p;if(maze[x1][y1]==0){p=(Mlink *)malloc(sizeof(Mlink));p->row=x1;p->col=y1;p->next=NULL;stack=p; //将入口放入堆栈maze[stack->row][stack->col]=1;//标志入口已访问while((!(stack->row==NULL&&stack->col==NULL))&&(!(stack->row==x2&&stack->col==y2)))//未找到出口并且堆栈不空{if(maze[stack->row+1][stack->col]==0) //下面可通{p=(Mlink *)malloc(sizeof(Mlink));p->row=stack->row+1;p->col=stack->col;p->next=stack; //入栈stack=p;maze[stack->row][stack->col]=1; //标记已访问}else if(maze[stack->row][stack->col+1]==0) //右面位置可通{p=(Mlink *)malloc(sizeof(Mlink));p->row=stack->row;p->col=stack->col+1;p->next=stack; //入栈stack=p;maze[stack->row][stack->col]=1;//标记已访问}else if(maze[stack->row-1][stack->col]==0) //左面可通{p=(Mlink *)malloc(sizeof(Mlink));p->row=stack->row-1;p->col=stack->col;p->next=stack; //入栈stack=p;maze[stack->row][stack->col]=1;//标记已访问}else if(maze[stack->row][stack->col-1]==0)//上面可通{p=(Mlink *)malloc(sizeof(Mlink));p->row=stack->row;p->col=stack->col-1;p->next=stack; //入栈stack=p;maze[stack->row][stack->col]=1;//标记已访问}else //不可通返回上一点{if (stack->next!=NULL){ //堆栈里布置一个顶点则出栈并返回循环p=stack;stack=stack->next; //出栈free(p); //释放空间}else //堆栈里只有一个顶点即入口,此时若释放空间出栈会使循环{ //控制语句无法比较(因为stack->col,stack->row都已不存在,)stack->row=NULL;stack->col=NULL;stack->next=NULL;}}}if (stack->row==x2&&stack->col==y2) return (1);else return (0);}else return(0);}/****************************输出坐标通路*******************/void printonglu1(){Mlink *q;int i=1;printf("其中的一条通道为:\n");q=stack;printf(" 出口<--");while (q!=NULL){if(i%5==0)printf("\n");printf("[%d%3d]<--",q->row,q->col);q=q->next;i++;}printf("入口\n");}/*******************************分割线**********************//**********************输出图形通路**************************///2时输出↑,3时输出←,4时输出→,5时输出↓void printonglu2(int a,int b){printf("图形通路如下:\n");int z;printf(" ");for(z=1;z<=b;z++) //图形上方标明列号{if(z<10)printf("%d ",z);elseprintf("%d",z);}int i,j;Mlink *p;p=stack;backup[p->row][p->col]=6;while (p->next!=NULL){if(p->next->col!=NULL){if( p->row > p->next->row ) backup[p->next->row][p->next->col]=5;//下一节点在下else if(p->row<p->next->row) backup[p->next->row][p->next->col]=2;//下一节点在上else if(p->col>p->next->col) backup[p->next->row][p->next->col]=4;//下一节点在右else backup[p->next->row][p->next->col]=3;//下一节点在左}else ;p=p->next;}for(i=1;i<=a;i++){printf("\n");if(i<10) printf("%d ",i); //图形左方标明行号else printf("%d",i);for(j=1;j<=b;j++){if(backup[i][j]==0)printf("□");if(backup[i][j]==1)printf("■");if(backup[i][j]==2)printf("↑");if(backup[i][j]==3)printf("←");if(backup[i][j]==4)printf("→");if(backup[i][j]==5)printf("↓");if(backup[i][j]==6)printf("㊣");}}}//***********************************************************void main(){system("color f0"); //背景为白色int k=1,a,b;int maze[M+2][N+2];//迷宫矩阵int abc[M+2][N+2],p,q; //备份数组以重复使用迷宫printf("建立迷宫!!!\n");printf("输入迷宫矩阵的行列数M,N!!!\n");scanf("%d%d",&a,&b);create(maze,a,b); //建立迷宫for(p=0;p<=a+2;p++)for(q=0;q<=b+2;q++)abc[p][q]=maze[p][q];while(k!=0){int x,x1,x2,y1,y2;prin(maze,a,b); //打印迷宫矩阵printf("\n输入迷宫入口:\n");scanf("%d%d",&x1,&y1);printf("输入迷宫出口:\n");scanf("%d%d",&x2,&y2);x=Mazepath(maze,x1,x2,y1,y2);if(x==1) //迷宫可通{printonglu1(); //打印坐标通路printonglu2(a,b);//打印图形通路printf("\n");}elseprintf("无通路!\n");//不可通for(p=0;p<=a+2;p++)for(q=0;q<=b+2;q++){backup[p][q]=abc[p][q];maze[p][q]=abc[p][q];}printf("输入0结束:\n");scanf("%d",&k);}}。

相关文档
最新文档