迷宫问题C++代码
用C语言解决迷宫问题
⽤C语⾔解决迷宫问题#include <stdio.h>#include <stdlib.h>#define ROW 10#define COL 10/*迷宫中位置信息*/typedef struct position{int x;int y;}position;/*在迷宫中的当前位置的信息,也是⼊栈的基本元素*/typedef struct SElem{int di;position seat;}SElem;/*链式栈中节点的定义*/typedef struct position_stack{SElem p;struct position_stack *next;}*Stack_pNode,Stack_Node;void InitStack(Stack_pNode *Link){*Link = NULL;}void push(Stack_pNode *Link,SElem e){Stack_pNode new_SElem = (Stack_pNode)calloc(1,sizeof(Stack_Node));new_SElem->p = e;new_SElem->next = NULL;if (*Link == NULL)*Link = new_SElem;else{new_SElem->next = *Link;*Link = new_SElem;}}int pop(Stack_pNode *Link,SElem *e){if (*Link == NULL)return 0;*e = (*Link)->p;Stack_pNode q = *Link;*Link = (*Link)->next;free(q);return 1;}int top(Stack_pNode Link, SElem *e){if (Link == NULL)return 0;*e = Link->p;return 1;}int empty(Stack_pNode Link){if (Link == NULL)return 1;elsereturn 0;}int reverse(Stack_pNode *Link){Stack_pNode p, q, r;if (*Link == NULL || (*Link)->next == NULL)return 0;r = *Link;p = (*Link)->next;q = NULL;while (p){r->next = q;q = r;r = p;p = p->next;}r->next = q;*Link = r;}void print(Stack_pNode Link){Stack_pNode r = Link;while (r){printf("(%d,%d) -> ",r->p.seat.x,r->p.seat.y);r = r->next;}printf("exit\n");}int curstep = 1;/*纪录当前的⾜迹,填写在探索前进的每⼀步正确的路上*//*迷宫地图。
c语言~走迷宫
本程序代码为C语言解决数据结构(严蔚敏)中关于迷宫的问题。
程序不仅实现迷宫路径查找,还实现文字描述路径功能可以直接粘贴到vc6.0中运行【代码如下】# include <stdio.h> # include <malloc.h> # define null 0typedef struct{int (*base)[2];int (*top)[2];int listlen;}sqlist;int topelem[2]; //栈顶元素void creatstack(sqlist *mazepath); //创建一个存储路径的栈void creatmap(int (*mazemap)[10]); //创建迷宫图纸void printmap(int (*mazemap)[10]);void footprint(int x,int y,int k,int (*mazemap)[10]);int position(int x,int y); //判断是否到终点int passroad(int x,int y,int (*mazemap)[10]);void findpath(int (*mazemap)[10],sqlist *mazepath); //在mazemap当中寻找mazepahtvoid printpath(sqlist *mazepath);void roadinwords(sqlist *mazepath); //文字叙述如何走迷宫void push(int x,int y,sqlist *mazepath); //栈操作void pop(sqlist *mazepath);void gettop(sqlist *mazepath);void main(){sqlist mazepath;creatstack(&mazepath); //创建一个存储路径的栈int mazemap[10][10]={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,0,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};// creatmap(mazemap); //创建迷宫图纸printf("迷宫原图为:\n");printmap(mazemap);findpath(mazemap,&mazepath); //在mazemap当中寻找mazepaht printf("走出迷宫图纸为:\n");printmap(mazemap);printf("走出迷宫文字叙述为:\n");roadinwords(&mazepath);// printpath(&mazepath);}void findpath(int (*mazemap)[10],sqlist *mazepath){int x,y,flag=0,k=0,next; //位置是否可通,flag=0通,1墙,2通但不可走x=1;y=1; //获取初始位置push(x,y,mazepath); //起点位置进栈footprint(x,y,6,mazemap);while(flag==0 && k!=162) //flag==1到达终点,0未到达终点{if(passroad(x,y+1,mazemap)==0)push(x,y+1,mazepath),y=y+1,footprint(x,y,6,mazemap);else if(passroad(x+1,y,mazemap)==0)push(x+1,y,mazepath),x=x+1,footprint(x,y,6,mazemap);else if(passroad(x,y-1,mazemap)==0)push(x,y-1,mazepath),y=y-1,footprint(x,y,6,mazemap);else if(passroad(x-1,y,mazemap)==0)push(x-1,y,mazepath),x=x-1,footprint(x,y,6,mazemap);elsefootprint(x,y,2,mazemap),pop(mazepath),gettop(mazepath),x=topelem[0],y= topelem[1];// printmap(mazemap);k++;flag=position(x,y); //判断是否到达终点// printf("flag==%d\n",flag);}}void creatstack(sqlist *mazepath){mazepath->base=(int (*)[2])malloc(120*sizeof(int (*)[2]));mazepath->top=mazepath->base;mazepath->listlen=120;}void push(int x,int y,sqlist *mazepath){**(mazepath->top)=x;*(*(mazepath->top)+1)=y;mazepath->top++;}void pop(sqlist *mazepath){if(mazepath->top!=mazepath->base)mazepath->top--;}void printmap(int (*mazemap)[10]){int (*p)[10];p=mazemap;int i,j;printf(" \n\n\n");for(i=0;i<10;i++){for(j=0;j<10;j++){if(j==0)printf(" ");if(*(*(p+i)+j)==0)printf("▇");else if(*(*(p+i)+j)==1)printf("□");else if(*(*(p+i)+j)==6)printf("★");elseprintf("▇");if(j==9)printf("\n");}}printf("\n\n");}void printpath(sqlist *mazepath){int (*p)[2];p=mazepath->base;while(p!=mazepath->top){printf("x=%d,y=%d\n",**p,*(*p+1));p++;}}void gettop(sqlist *mazepath){int (*p)[2];int (*q)[2];p=mazepath->base;while(p!=mazepath->top){q=p;p++;}topelem[0]=**q;topelem[1]=*(*q+1);}void footprint(int x,int y,int k,int (*mazemap)[10]){if(x<10 && y<10)*(*(mazemap+x)+y)=k;}int position(int x,int y){int flag;if(x==8 && y==8)flag=1;elseflag=0;return(flag);}int passroad(int x,int y,int (*mazemap)[10]) {int num=1;if(x<10 && y<10)num=*(*(mazemap+x)+y);return(num);}void roadinwords(sqlist *mazepath){int x=1,y=1,i=0;int (*p)[2];p=mazepath->base;p++;while(p!=mazepath->top){if(x==**p && y+1==*(*p+1))printf("向右走→→"),x=**p,y=*(*p+1);else if(x+1==**p && y==*(*p+1))printf("向下走→→"),x=**p,y=*(*p+1);else if(x==**p && y-1==*(*p+1))printf("向左走→→"),x=**p,y=*(*p+1);else if(x-1==**p && y==*(*p+1))printf("向上走→→"),x=**p,y=*(*p+1);i++;if(i%3==0)printf("\n");p++;}printf("\n");}。
c语言迷宫游戏代码
paint(x,y);
y--;
}
break;
case Right: //向右走
if(map[x][y+1]!=Wall)
{
paint(x,y);
y++;
}
break;
}
}
}
int main()Leabharlann {int i,j;
srand((unsigned)time(NULL)); //初始化随即种子
hidden(); //隐藏光标
#define Start 2
#define End 3
#define Esc 5
#define Up 1
#define Down 2
#define Left 3
#define Right 4
int map[Height+2][Width+2];
void gotoxy(int x,int y) //移动坐标
{
char c;
while(c=getch())
{
if(c==27) return Esc; //Esc
if(c!=-32)continue;
c=getch();
if(c==72) return Up; //上
if(c==80) return Down; //下
if(c==75) return Left; //左
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}
void hidden()//隐藏光标
c语言迷宫问题代码实现
structStackList
{
SEAT stack[MAXSIZE];
inttop;
}*Stack;
intEmptyStack(StackList*Stack)//判断是否为空栈
{
if(Stack->top==0)
return 0;
else
return 1;
}
intMove[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//分别表示向东、西、南、北需要加上的坐标
CurSeat=temp;
find =1;
}
}
}
}
}while(EmptyStack(Stack));
return false;
}
voidPrintStack(StackList*Stack)//输出路线
{
if(Stack->top==0)
printf("There is no route can be out of the maze\n");
Mark(CurSeat);
if(CurSeat.x==end.x+1&&CurSeat.y==end.y+1)//如果找到出口,返回
{
return true;
}
else
{
intfind=0;
while(CurSeat.di<3&&find==0)//找下一个结点的方向
{
CurSeat.di++;
SEAT temp;
scanf("%d",&n);
printf("Please enter the labyrinth of the coordinates of the wall unit(0<=row,column):\n");
用c语言实现迷宫求解完美源代码
优先队列:用于存储待扩展节点,按照 f(n)值从小到大排序
A*搜索算法的C语言实现
算法流程:包括初始化、搜索、更新父节点等步骤 数据结构:使用优先队列来存储待搜索节点和已访问节点 实现细节:包括如何计算启发式函数、如何选择下一个节点等 性能优化:可以采用多线程、缓存等技术来提高算法的效率
A*搜索算法在迷宫求解中的应用
C语言实现A*搜 索算法
A*搜索算法的基本原理
定义:A*搜索算法是一种启发式搜索 算法,结合了最佳优先搜索和Dijkstra 算法的优点
基本思想:使用启发函数来评估节点的 重要性,优先选择最有希望的节点进行 扩展,从而有效地缩小搜索范围
关键参数:g(n):从起点经过节点n的 实际代价;h(n):从n到目标的估计代 价(启发式函数);f(n)=g(n)+h(n)
最短路径搜索
优化技巧:为了 提高搜索效率和 精度,可以采用 一些优化技巧, 如限制搜索范围、 使用优先队列等
C语言实现 Dijkstra算法
Dijkstra算法的基本原理
Dijkstra算法是一种用于求解最短路径问题的贪心算法 该算法通过不断选择当前最短路径的节点来逼近最短路径 Dijkstra算法适用于带权重的图,其中权重表示节点之间的距离 Dijkstra算法的时间复杂度为O((V+E)logV),其中V是节点数,E是边数
算法复杂度分析:时间复杂 度和空间复杂度分析
感谢您的观看
汇报人:XX
迷宫求解算法的C语言实现流程
初始化迷宫和路径
定义四个方向的移动方向
遍历迷宫,找到起点和终点
使用深度优先搜索或广度优先 搜索算法求解路径
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"` 和 `"*"`,其他地方都为空。
C语言迷宫源代码
#include <graphics.h>#include <stdlib.h>#include <bios.h>/*定义几个功能按键*/#define ESC 0x11b /*强行退出游戏*/#define UP 0x4800 /*上下左右四个按键移动小人*/#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00int a[50][50]={0}; /* 存放地图信息的数组0:不可走的障碍物1:可以走的路*/ int qdx=1,qdy=1,zdx=20,zdy=20; /* 起点和终点的坐标*/int renx,reny; /* 小人坐标*/int d=20; /* 小格子的间距*/int kk=0,rr=2;main(){int i,j,m=30,n=16,d=20,k;int gdriver = DETECT, gmode;randtu(200);renx=qdx,reny=qdy;registerbgidriver(gdriver);initgraph(&gdriver, &gmode, "c:\\turboc2");redraw();while(1) /* 反复从键盘获得程序需要的按键*/{if(bioskey(1)) /* 判断是否有按键*/{k=bioskey(0); /* 将按键存入变量k */switch(k) /* 对按键进行分情况处理*/{case ESC: /* ESC键退出*/printf("%d times\n",kk);exit(0); break;case UP: /* UP键向上移动光标*/if(a[renx][reny-1]==1){reny-=1;redraw();}break;case DOWN: /* DOWN键向下移动光标*/if(a[renx][reny+1]==1){reny+=1;redraw();}break;case LEFT: /* LEFT键向左移动光标*/if(a[renx-1][reny]==1){renx-=1;redraw();}break;case RIGHT: /* RIGHT键向右移动光标*/if(a[renx+1][reny]==1){renx+=1;redraw();}break;}}}getch();closegraph();}/*redraw重画函数在用户有操作后,重画游戏画面*/redraw(){int i,j;for(i=qdx;i<=zdx;i++)for(j=qdy;j<=zdy;j++){if(i<renx+rr && i>renx-rr && j<reny+rr && j>reny-rr)if(a[i][j]==0) geziza(i*d,j*d);else gezilu(i*d,j*d);else gezibk(i*d,j*d);}drawren(renx*d,reny*d);}/*随机地图(randlei)函数用于随机生成地图*/randtu(int num){int i,j,xx,yy,sum,t,m,n;srand(time(NULL));loop: sum=0;m=zdy-qdy+1;n=zdx-qdx+1;a[qdx][qdy]=1;a[zdx][zdy]=1;do{t=random(m*n);xx=t/m+1;yy=t%m+1;if(a[xx][yy]==0){a[xx][yy]=1;sum++;}}while(sum<num);if(ok()) return;for(i=0;i<50;i++)for(j=0;j<50;j++)a[i][j]=0;kk++;goto loop;}ok(){ int b[50][50]={0};b[qdx][qdy]=1;tansuo(qdx,qdy,b);return(b[zdx][zdy]);}tansuo(int x,int y,int *b[50][50]) /* 如果当前格子为空白无雷情况,向周围探索相类似的情况,并打开周围的数字*/{if(a[x][y-1]==1 && b[x][y-1]==0){b[x][y-1]=1;tansuo(x,y-1,b);}if(a[x+1][y]==1 && b[x+1][y]==0){b[x+1][y]=1;tansuo(x+1,y,b);}if(a[x-1][y]==1 && b[x-1][y]==0){b[x-1][y]=1;tansuo(x-1,y,b);}if(a[x][y+1]==1 && b[x][y+1]==0){b[x][y+1]=1;tansuo(x,y+1,b);}}/*绘制障碍物小格子(geziza)int x : 格子左上角点横坐标int y :格子左上角点纵坐标*/geziza(int x,int y){int i;setcolor(8);rectangle(x,y,x+d,y+d);setcolor(RED);setfillstyle(2,RED);bar(x+1,y+1,x+d-1,y+d-1);/* 设置深灰色为格子边框*/ }/*绘制障碍物小格子(geziza)int x : 格子左上角点横坐标int y :格子左上角点纵坐标*/gezibk(int x,int y){int i;setcolor(8);rectangle(x,y,x+d,y+d);setcolor(BLUE);setfillstyle(2,BLUE);bar(x+1,y+1,x+d-1,y+d-1);/* 设置深灰色为格子边框*/}gezilu(int x,int y){int i;setcolor(8); /* 设置深灰色为格子边框*/ rectangle(x,y,x+d,y+d);setcolor(BLUE);setfillstyle(8,BLUE);bar(x+1,y+1,x+d-1,y+d-1);}/*画小人(drawren)函数用于绘制给定坐标位置的小人小人画在格子的正中心格子背景色为红色int x : 所在格子左上角点横坐标int y :所在格子左上角点纵坐标*/drawren(int x,int y){int i;setcolor(8); /* 设置深灰色为格子边框*/ rectangle(x,y,x+d,y+d);setcolor(YELLOW);for(i=1;i<d/2-3;i++)circle(x+d/2,y+d/2,i);}/*over(over)函数用于判断游戏是否结束*/over(){}。
迷宫(direction)C语言代码
};
mazePath(maze,direction,1,1,6,9);
getchar();
return 0;
}
#include<stdio.h>
#include<conio.h>
intmigong[10][10]= //设置迷宫,最外围1为墙 里边0为可走路径 1为障碍
voidpush_seq(PSeqStackpastack,DataTypex ) {
if(pastack->t >= MAXNUM - 1 )
printf( "Overflow! \n" );
else {
pastack->t++;
pastack->s[pastack->t] = x;
}
}
/* 删除栈顶元素 */
element =top_seq(st);
pop_seq(st);
i=element.x; j =element.y;
for (k =element.d+ 1; k <= 3; k++) { /* 依次试探每个方向 */
g =i+ direction[k][0];h = j + direction[k][1];
lj[top].x=1;
lj[top].y=1;
migong[1][1]=-1;
find=0;d=-1;
while(top>-1){
if(lj[top].x==8&&lj[top].y==8)
{
printf("迷宫路径如下:\n");
c语言版 迷宫 完整版代码
line(500,200,450,250);
outtextxy(445,270,"z");
line(500,200,550,250);
case 7: (*y)--;break; /*左*/
case 8: (*x)--;(*y)--;break; /*左上*/ }
setfillstyle(SOLID_FILL,RED);/*新位置显示探索物*/
bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6); }
else if(c=='x'&&map[x+1][y]!=1) DrawPeople(&x,&y,5);/*下*/
else if(c=='z'&&map[x+1][y-1]!=1) DrawPeople(&x,&y,6); /*左下*/
WayCopy(oldmap,map);
if(oldmap[i+1][j]==0&&!yes)/*判断下方是否可以走,如果标志yes已经是1也不用找下去了*/
{ FindWay(oldmap,i+1,j);
{ FindWay(oldmap,i,j+1);
if(yes) { way[wayn][0]=i; way[wayn++][1]=j; return; } }
WayCopy(oldmap,map);
#include <graphics.h>
c语言迷宫代码
c语言迷宫代码C语言迷宫代码是指用C语言编写的程序,用于生成和解决迷宫问题的算法。
迷宫通常由一个矩形网格组成,其中包含墙壁和通道。
目标是找到从迷宫的起点到终点的路径,同时避开墙壁。
下面是一个简单的示例代码,用于生成迷宫:```c#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#define ROWS 10#define COLS 10typedef struct {int x;int y;} Point;void generateMaze(int maze[ROWS][COLS]) {for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {if (i % 2 == 0 || j % 2 == 0) { maze[i][j] = 1; // 墙壁} else {maze[i][j] = 0; // 通道}}}}void printMaze(int maze[ROWS][COLS]) {for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {printf('%d ', maze[i][j]);}printf('');}}int main() {int maze[ROWS][COLS];generateMaze(maze);printMaze(maze);return 0;}```在上面的代码中,我们使用一个二维数组来表示迷宫。
数组中的值为1表示墙壁,值为0表示通道。
使用generateMaze函数,我们将迷宫的墙壁和通道初始化为适当的值。
然后使用printMaze函数打印迷宫。
通过运行上面的代码,我们可以得到一个简单的迷宫的表示:```1 1 1 1 1 1 1 1 1 11 0 1 0 1 0 1 0 1 11 1 1 1 1 1 1 1 1 11 0 1 0 1 0 1 0 1 11 1 1 1 1 1 1 1 1 11 0 1 0 1 0 1 0 1 11 1 1 1 1 1 1 1 1 11 0 1 0 1 0 1 0 1 11 1 1 1 1 1 1 1 1 11 0 1 0 1 0 1 0 1 1```当然,上述代码只是生成了一个简单的迷宫,还没有解决迷宫问题。
(完整word版)c语言迷宫最完整做法
#include〈stdio。
h〉#include〈stdlib。
h>#include〈time.h>#define stack_init_size 200#define stack_increment 10#define ERROE 0#define TRUE 1#define FALSE 0#define OVERFLOW 0#define OK 1typedef int Status;typedef struct{int x;int y;}PosType;typedef struct {int ord; // 通道块在路径上的“序号”PosType seat; //通道块在迷宫中的“坐标位置”int di; //从此通道块走向下一通道块的“方向”}SElemType;typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;int mg[20][20];/*随机生成迷宫的函数/*为了能够让尽量能通过,将能通过的块和不能通过的块数量比大致为2:1*/void Random(){int i,j,k;srand(time(NULL));mg[1][0]=mg[1][1]=mg[18][19]=0; //将入口、出口设置为“0"即可通过for(j=0;j〈20;j++)mg[0][j]=mg[19][j]=1;/*设置迷宫外围“不可走”,保证只有一个出口和入口*/ for(i=2;i〈19;i++)mg[i][0]=mg[i—1][19]=1; /*设置迷宫外围“不可走”,保证只有一个出口和入口*/ for(i=1;i〈19;i++)for(j=1;j<19;j++){k=rand()%3; //随机生成0、1、2三个数if(k)mg[i][j]=0;else{if((i==1&&j==1)||(i==18&&j==18)) /*因为距入口或出口一步的路是必经之路,故设该通道块为“0”加大迷宫能通行的概率*/mg[i][j]=0;elsemg[i][j]=1;}}}//构造一个空栈Status InitStack(SqStack &s){s。
数据结构迷宫问题完整代码
int main(int argc, char* argv[])
{
struct SqStack *p=Init();
int a[10][10]={{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},
printf("%d,%d,%d,%d\n",e.ord,e.seat.x,e.seat.y,e.di);
}
}
int Pass(struct PosType cur,int b[10][10])
{
if(b[cur.x][cur.y]==1)
return 0;
else return 1;
#include "stdafx.h"
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <malloc.h>
#include <stdlib.h>
struct PosType{
int x;
int y;
};
int curstep=1;
do
{
if(Pass(curpos,a))
{
FootPrint(curpos,a);
e.di=1;
e.ord=curstep;
e.seat=curpos;
Push(p,e);
printf("%d,%d,%d,%d\n",e.ord,e.seat.x,e.seat.y,e.di);
用c语言实现迷宫求解完美源代码
用c语言实现迷宫求解完美源代码#include#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define UNDERFLOW -2typedef int Status;//-----栈开始-----typedef struct{//迷宫中r行c列的位置int r;int c;}PostType;//坐标位置类型typedef struct{int ord;// 当前位置在路径上的序号PostType seat;// 当前坐标int di;// 从此通块走向下一通块的“方向”}SElemType;// 栈的元素类型//定义链式栈的存储结构struct LNode{SElemType data;//数据域struct LNode *next;//指针域};struct LStack{struct LNode *top;//栈顶指针};Status InitStack(LStack &s)//操作结果:构造一个空栈S {struct LNode *p;p=(LNode *)malloc(sizeof(LNode));if(!p){printf("分配失败,退出程序");exit(ERROR);}s.top=p;p->next=NULL;return OK;}Status StackEmpty(LStack s)//若栈s为空栈,则返回TRUE,否则FALSE{if(s.top->next==NULL) return TRUE;return FALSE;}Status Push(LStack &s,SElemType e)//插入元素e成为新的栈顶元素{struct LNode *p;p=(LNode *)malloc(sizeof(LNode));if(!p) exit(OVERFLOW);s.top->data=e;p->next=s.top;s.top=p;return OK;}Status Pop(LStack &s,SElemType &e)//删除s的栈顶元素,并且用e返回其值{struct LNode *p;if(!(s.top->next)) exit(UNDERFLOW);p=s.top;s.top=p->next;e=s.top->data;free(p);return OK;}Status DestroyStack(LStack &s)//操作结果:栈s被销毁{struct LNode *p;p=s.top;while(p){s.top=p->next;free(p);p=s.top;}return OK;}//-----栈结束------//-----迷宫开始-------#define MAXLEN 10// 迷宫包括外墙最大行列数typedef struct{int r;int c;char adr[MAXLEN][MAXLEN];// 可取' ''*' '@' '#'}MazeType;// 迷宫类型Status InitMaze(MazeType&maze){// 初始化迷宫,成功返回TRUE,否则返回FALSE int m,n,i,j;printf("输入迷宫行数和列数(包括了外墙): ");scanf("%d%d",&maze.r,&maze.c); // 输入迷宫行数和列数for(i=0;i<=maze.c+1;i++){// 迷宫行外墙maze.adr[0][i]='#';maze.adr[maze.r+1][i]='#';}//forfor(i=0;i<=maze.r+1;i++){// 迷宫列外墙maze.adr[i][0]='#';maze.adr[i][maze.c+1]='#';}for(i=1;i<=maze.r;i++)for(j=1;j<=maze.c;j++)maze.adr[i][j]=' ';// 初始化迷宫printf("输入障碍的坐标((-1 -1)结束): ");scanf("%d%d",&m,&n);// 接收障碍的坐标while(m!=-1){if(m>maze.r || n>maze.c)// 越界exit(ERROR);maze.adr[m][n]='#';// 迷宫障碍用#标记printf("输入障碍的坐标((-1,-1)结束): ");scanf("%d%d",&m,&n);}//whilereturn OK;}//InitMazeStatus Pass(MazeType maze,PostType curpos){// 当前位置可同则返回TURE,否则返回FALSEif(maze.adr[curpos.r][curpos.c]==' ')// 可通return TRUE;elsereturn FALSE;}//PassStatus FootPrint(MazeType &maze,PostType curpos) {// 若走过并且可通,则返回TRUE,否则返回FALSE maze.adr[curpos.r][curpos.c]='*';//"*"表示可通return OK;}//FootPrintPostType NextPos(PostType &curpos,int i){// 指示并返回下一位置的坐标PostType cpos;cpos=curpos;switch(i){//1.2.3.4 分别表示东南西北方向case 1 : cpos.c+=1; break;case 2 : cpos.r+=1; break;case 3 : cpos.c-=1; break;case 4 : cpos.r-=1; break;default: exit(ERROR);}return cpos;}//NextposStatus MarkPrint(MazeType &maze,PostType curpos) {// 曾走过,但不是通路标记,并返回OKmaze.adr[curpos.r][curpos.c]='@';//"@" 表示曾走过但不通return OK;}//MarkPrintStatus MazePath(MazeType &maze,PostType start,PostType end){// 若迷宫maze存在通路,则求出一条同路放在栈中,并返回TRUE,否则返回FALSE struct LStack S;PostType curpos;int curstep;// 当前序号,1,2,3,4分别表示东南西北方向SElemType e;InitStack(S);curpos=start; //设置"当前位置"为"入口位置"curstep=1;// 探索第一位printf("以三元组形式表示迷宫路径:\n");do{if(Pass(maze,curpos)){// 当前位置可以通过FootPrint(maze,curpos);// 留下足迹e.ord=curstep;e.seat=curpos;e.di=1;printf("%d %d %d-->",e.seat.r,e.seat.c,e.di);Push(S,e);// 加入路径if(curpos.r==end.r&&curpos.c==end.c)if(!DestroyStack(S))// 销毁失败exit(OVERFLOW);elsereturn TRUE; // 到达出口else{curpos=NextPos(curpos,1);// 下一位置是当前位置的东邻curstep++;// 探索下一步}//else}//ifelse{// 当前位置不通时if(!StackEmpty(S)){Pop(S,e);while(e.di==4&& !StackEmpty(S)){MarkPrint(maze,e.seat);Pop(S,e);// 留下不能通过的标记,并退一步}//whileif(e.di < 4){e.di++;// 换一个方向探索Push(S,e);curpos=NextPos(e.seat,e.di);// 设定当前位置是该方向上的相邻printf("%d %d %d-->",e.seat.r,e.seat.c,e.di);}//if}//if}//else}while(!StackEmpty(S));if(!DestroyStack(S))// 销毁栈exit(OVERFLOW);elsereturn FALSE;}//MazePathvoid PrintMaze(MazeType &maze){// 将标记路径信息的迷宫输出到终端int i,j;printf("\n输出迷宫(*表示通路):\n\n");printf("");for(i=0;i<=maze.r+1;i++)// 打印列数名printf("%4d",i);printf("\n\n");for(i=0;i<=maze.r+1;i++){printf("%2d",i);// 打印行名for(j=0;j<=maze.c+1;j++)printf("%4c",maze.adr[i][j]);// 输出迷宫当前位置的标记printf("\n\n");}}//PrintMazeint main(){// 主函数MazeType maze;PostType start,end;char cmd;do{printf("-------创建迷宫--------\n");if(!InitMaze(maze)){printf("Initialization errors\n");exit(OVERFLOW);// 初始化失败}do{// 输入迷宫入口坐标printf("\n输入迷宫入口坐标: ");scanf("%d%d",&start.r,&start.c);if(start.r>maze.r ||start.c>maze.c){printf("\nBeyond the maze\n"); continue;}}while(start.r>maze.r ||start.c>maze.c);do{// 输入迷宫出口坐标printf("\n输入迷宫出口坐标: ");scanf("%d%d",&end.r,&end.c);if(end.r>maze.r ||end.c>maze.c){printf("\nBeyond the maze\n"); continue;}}while(end.r>maze.r ||end.c>maze.c);if(!MazePath(maze,start,end))//迷宫求解printf("\nNo path from entranceto exit!\n"); elsePrintMaze(maze);// 打印路径printf("\n需要继续创建新的迷宫吗?(y/n): "); scanf("%s",&cmd);}while(cmd=='y' || cmd=='Y');}。
c语言迷宫代码
if(tt.l<min) min = tt.l;//最短路径更新
temp = s;
push(&p, tt);//从终点到起点依次入栈p,保存路径
push(&p, t);
while(!empty(&temp))
{
pop(&temp, &tt);
push(&p,tt);
}
step=0;
while(!empty(&p))//从起点到终点依次出栈p,输出路径
{
pop(&p, &tt);
if(step==0) step=1;
else printf(" -> ");
printf("(%d,%d)",tt.x,tt.y);
}
printf("\n");
if(map[i][j] == 'S') sx=i, sy=j;//寻找起点坐标
if(map[i][j] == 'E') ex=i, ey=j;//寻找终点坐标
}
}
dfs();//搜索路径
printf("路径总数:%d\n", num);//输出路径总数
if(num > 0)//若存在可行路径,输出最短、最长路径长度
{
printf("最短路径:%d\n", min);
printf("最长路径:%d\n", max);
}
}
{
datatype data[Maxn];//栈数据
迷宫问题源代码及运行结果
//其中0表示路,1表示墙,-1表示已走过//迷宫问题广度优先算法# include<stdio.h># include<stdlib.h>typedef struct squeue{int x;int y;int pre;}squeue;squeue Q[100]; //队列用于存放迷宫通路int qe,qh; //队列指针int map[8][8]={{0,0,0,0,0,0,0,0},{0,1,1,1,1,0,1,0},{0,0,0,0,1,0,1,0},{0,1,0,0,0,0,1,0},{0,1,0,1,1,0,1,0},{0,1,0,0,0,0,1,1},{0,1,0,0,1,0,0,0},{0,1,1,1,1,1,1,0}}; //存放迷宫地图int fx[5]={0,1,-1,0,0},fy[5]={0,0,0,-1,1}; //模拟四个运动方向int check(int i,int j) //检查当前位置是否合适{int flag=1;if(i<0||i>7) //检查行是否越界flag=0;if(j<0||j>7) //检查列是否越界flag=0;if(map[i][j]==1||map[i][j]==-1) //当前位置是否可行flag=0;return flag;}void print() //输出迷宫路径{ int sum=1;printf("\n所求密宫路径为:\n");printf("(%d,%d)",Q[qe].x,Q[qe].y);while(Q[qe].pre!=0){qe=Q[qe].pre;printf("<--(%d,%d)",Q[qe].x,Q[qe].y);sum++;if(sum%5==0)printf("\n");}// printf("<--(%d,%d)\n",Q[qe].x,Q[qe].y);}int search() //走迷宫{int i,j,k;qh=0;qe=1;map[0][0]=-1; //入口入队列,并将其标志变量致零Q[1].pre=0;Q[1].x=0;Q[1].y=0;while(qh!=qe){qh++; //队首元素出队列for(k=1;k<=4;k++) //搜索前后左右四个方向{i=Q[qh].x+fx[k];j=Q[qh].y+fy[k];if(check(i,j)==1){qe++; //入队列,并改变其标志变量Q[qe].x=i;Q[qe].y=j;Q[qe].pre=qh;map[i][j]=-1;if(Q[qe].x==7&&Q[qe].y==7) //若到迷宫出口,则输出路径{print();return 0;}}}}printf("NO Way!\n");return 0;}void main(){int i,j;printf("迷宫图为:");for(i=0;i<=7;i++) //输出原迷宫图{printf("\n");for(j=0;j<=7;j++)printf("%d ",map[i][j]);}printf("\n");search();}。
迷宫求解问题解答(C语言)
迷宫求解问题解答:#include<stdio.h>#include<stdlib.h>#include<stack>#include <iostream>#define STACK_INIT_SIZE 30000#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2using namespace std;typedef int Status;char maze[20][20];typedef struct{int r;int c;}PosType;typedef struct{PosType seat;int di;}SElemType;typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;SElemType e;Status Pass(PosType pos){if(maze[pos.r][pos.c]=='0')return OK;else return ERROR;}void FootPrint(PosType pos){maze[pos.r][pos.c]='*';}void MarkPrint(PosType pos){maze[pos.r][pos.c]='@';}PosType NextPos(PosType pos,int di){PosType dire[5]={{0,0},{0,1},{1,0},{0,-1},{-1,0}};pos.r+=dire[di].r;pos.c+=dire[di].c;return pos;}stack<SElemType> s;Status MazePath(PosType start, PosType end){PosType curpos=start;do{if(Pass(curpos)){FootPrint(curpos);e.seat=curpos;e.di=1;s.push(e);if((curpos.r==end.r)&&(curpos.c==end.c))return(TRUE);curpos=NextPos(curpos,1);}else{if(!s.empty()){e=s.top();s.pop();while((e.di==4)&&(!s.empty())){MarkPrint(e.seat);e=s.top();s.pop();}if(e.di<4){e.di++;s.push(e);curpos=NextPos(e.seat,e.di);}}}}while(!s.empty());return(FALSE);}int main(){int i,j,m,n,d;PosType start,end;FILE *fp=fopen("in.txt","r");fscanf(fp,"%d%d%d%d%d%d",&m,&n,&start.r,&start.c,&end.r,&end.c); for(i=1;i<=m;i++){for(j=1;j<=n;j++){fscanf(fp,"%d",&d);maze[i][j]=d+'0';}}fclose(fp);for(i=0;i<m+1;i++){maze[i][0]='1';maze[i][n+1]='1';}for(j=0;j<=n+1;j++){maze[0][j]='1';maze[m+1][j]='1';}for(i=0;i<=m+1;i++){for(j=0;j<=n+1;j++){if(j==n+1)printf("%c\n",maze[i][j]);else printf("%c ",maze[i][j]); }}printf("\n");MazePath(start,end);{for(i=0;i<=m+1;i++){for(j=0;j<=n+1;j++){if(maze[i][j]=='1')maze[i][j]='#';if(maze[i][j]=='0')maze[i][j]=' ';printf("%c",maze[i][j]);if(j<n+1)printf(" ");}printf("\n");}}return 0;}。
迷宫问题——精选推荐
迷宫问题问题描述以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
需求分析(1)实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d 表示走到下一个坐标的方向。
(2)编写递归形式的算法,求得迷宫中所有可能的通路。
以下分开处理两个问题,便于理解。
一、用链栈实现迷宫求解C源代码如下:#include<stdio.h>#include<malloc.h>#define maxsize 100#define NULL 0typedef struct //定义迷宫{int Maze[maxsize][maxsize]; //二维数组存放迷宫信息int maze_x,maze_y; //迷宫的行数和列数}maze;typedef struct point //链栈的每个结点定义{int vex_x,vex_y; //结点的横纵坐标int direction; //下一个结点的方向struct point *next; //指向下一个结点}Point;maze creat(){int i,j;maze a;printf("输入迷宫的行数和列数:");scanf("%d%d",&a.maze_x,&a.maze_y);//输入迷宫的行数和列数for(i=1;i<=a.maze_x;i++){printf("输入第%d行:",i);for(j=1;j<=a.maze_y;j++)scanf("%d",&a.Maze[i][j]);//输入迷宫信息,0为通路,1为不通}return a;}int found(int x,int y,Point *head) //判断当前结点是否在链栈中出现,若出现返回1,否则返回0{Point *p=head;while(p){if(x==p->vex_x&&y==p->vex_y)return 1;p=p->next;}return 0;}Point *secret(maze a) //迷宫函数,返回一条通路,或者NULL {Point *top,*p; //top为链栈的栈顶指针int j,m,x,y;p=(Point *)malloc(sizeof(Point));//p为当前处理结点的指针p->vex_x=1;p->vex_y=1;p->next=NULL;//p->vex_x和p->vex_y的初值为1top=p;//top指向pj=1;//j为方向,1,2,3,4分别为东,南,西,北do{while(j<=4){m=0;//m判断是否有符合条件的结点,若有为1,没有为0.初值为0x=top->vex_x;y=top->vex_y;switch(j){case 1:if(y+1<=a.maze_y&&!a.Maze[x][y+1]&&!found(x,y+1,top))//若纵坐标加1后,在迷宫范围内,当前结点为0,当前结点没有在链栈中出现,则当前结点加入链栈{p=(Point *)malloc(sizeof(Point));p->vex_x=x;p->vex_y=y+1;p->next=top;top->direction=j;top=p;m=1;}break;case 2:if(x+1<=a.maze_x&&!a.Maze[x+1][y]&&!found(x+1,y,top))//若横坐标加1后,在迷宫范围内,当前结点为0,当前结点没有在链栈中出现,则当前结点加入链栈{p=(Point *)malloc(sizeof(Point));p->vex_x=x+1;p->vex_y=y;p->next=top;top->direction=j;top=p;m=1;}break;case 3:if(y-1<=a.maze_y&&!a.Maze[x][y-1]&&!found(x,y-1,top))//若纵坐标减1后,在迷宫范围内,当前结点为0,当前结点没有在链栈中出现,则当前结点加入链栈{p=(Point *)malloc(sizeof(Point));p->vex_x=x;p->vex_y=y-1;p->next=top;top->direction=j;top=p;m=1;}break;case 4:if(x-1<=a.maze_x&&!a.Maze[x-1][y]&&!found(x-1,y,top))//若横坐标减1后,在迷宫范围内,当前结点为0,当前结点没有在链栈中出现,则当前结点加入链栈{p=(Point *)malloc(sizeof(Point));p->vex_x=x-1;p->vex_y=y;p->next=top;top->direction=j;top=p;m=1;}break;}if(m!=0)//若找到符合条件的结点,则j赋1,然后退出while循环{j=1;break;}else j++;//若没有,则j加1}if(j>4)//4个方向都找不到符合条件的结点时{if(top!=NULL){top=top->next;if(top==NULL)return NULL;//若top空,则返回NULLj=top->direction+1;top->direction=j;}}}while(top->vex_x!=a.maze_x||top->vex_y!=a.maze_y);//如果当前结点不是出口,则继续进行do循环if(top->vex_x==a.maze_x&&top->vex_y==a.maze_y)top->direction=0;return top;}int print(Point *p)//输出结果{int i=0,top=0;Point *stack[maxsize];if(p==NULL){printf("不能到达出口!\n");return 0;}else{printf("输出迷宫路径(三元组表示):\n");while(p!=NULL)//通过一个栈将链栈逆序{stack[top++]=p;p=p->next;}while(top>0){top--;printf("(%d,%d,%d)",stack[top]->vex_x,stack[top]->vex_y,stack[top]->direction) ;//输出结果i++;if(i%8==0)printf("\n");}}printf("\n");return 1;}void printmazepath(Point *p,maze road)//输出迷宫路径{int i,j;char m[maxsize][maxsize];printf("迷宫路径(图示):\n");for(i=1;i<=road.maze_x;i++)for(j=1;j<=road.maze_y;j++){if(road.Maze[i][j])m[i][j]='1';else m[i][j]='0';}while(p){switch(p->direction){case 0:m[p->vex_x][p->vex_y]=1;break;case 1:m[p->vex_x][p->vex_y]=26;break;case 2:m[p->vex_x][p->vex_y]=25;break;case 3:m[p->vex_x][p->vex_y]=27;break;case 4:m[p->vex_x][p->vex_y]=24;break;}p=p->next;}for(i=1;i<=road.maze_x;i++)for(j=1;j<=road.maze_y;j++){printf("%c",m[i][j]);if(j<road.maze_y)printf(" ");else printf("\n");}}void main()//主函数{maze road;Point *p;road=creat();//创建二维迷宫p=secret(road);//搜索路径if(print(p))printmazepath(p,road);//如果有路径可走,输出路劲}运行结果:二、递归算法求解迷宫所有通路C源代码如下:#include<stdio.h>#include<malloc.h>#define maxsize 100#define NULL 0typedef struct //定义迷宫{int Maze[maxsize][maxsize]; //二维数组存放迷宫信息int maze_x,maze_y; //迷宫的行数和列数}maze;maze a;typedef struct point //链栈的每个结点定义{int vex_x,vex_y; //结点的横纵坐标int direction; //下一个结点的方向struct point *next; //指向下一个结点}Point;maze creat(){int i,j;maze a;printf("输入迷宫的行数和列数:");scanf("%d%d",&a.maze_x,&a.maze_y);//输入迷宫的行数和列数for(i=1;i<=a.maze_x;i++){printf("输入第%d行:",i);for(j=1;j<=a.maze_y;j++)scanf("%d",&a.Maze[i][j]);//输入迷宫信息,0为通路,1为不通}return a;}int found(int x,int y,Point *head) //判断当前结点是否在链栈中出现,若出现返回1,否则返回0{Point *p=head;while(p){if(x==p->vex_x&&y==p->vex_y)return 1;p=p->next;}return 0;}int k=1;int print(Point *p)//输出结果{int i=0,top=0;Point *stack[maxsize];if(p==NULL) {printf("不能到达出口!\n");return 0;}else{printf("输出第%d条迷宫路径(三元组表示):\n",k++);while(p!=NULL)//通过一个栈将链栈逆序{stack[top++]=p;if(top==1)stack[top-1]->direction=0;p=p->next;}while(top>0){top--;printf("(%d,%d,%d)",stack[top]->vex_x,stack[top]->vex_y,stack[top]->direction) ;//输出结果i++;if(i%8==0)printf("\n");}}printf("\n");return 1;}void printmazepath(Point *p,maze road){int i,j;char m[maxsize][maxsize];printf("迷宫路径(图示):\n");for(i=1;i<=road.maze_x;i++)for(j=1;j<=road.maze_y;j++){if(road.Maze[i][j])m[i][j]='1';else m[i][j]='0';}while(p){switch(p->direction){case 0:m[p->vex_x][p->vex_y]=1;break;case 1:m[p->vex_x][p->vex_y]=26;break;case 2:m[p->vex_x][p->vex_y]=25;break;case 3:m[p->vex_x][p->vex_y]=27;break;case 4:m[p->vex_x][p->vex_y]=24;break;}p=p->next;}for(i=1;i<=road.maze_x;i++)for(j=1;j<=road.maze_y;j++){printf("%c",m[i][j]);if(j<road.maze_y)printf(" ");else printf("\n");}printf("\n");}int sign=0;void mazepath(Point *p,int j){int x,y,i;Point *q;x=p->vex_x;y=p->vex_y;switch(j){case 1:if(y+1<=a.maze_y&&!found(x,y+1,p)&&!a.Maze[x][y+1]){q=(Point*)malloc(sizeof(Point));q->vex_x=x;q->vex_y=y+1;q->next=p;p->direction=j;if(q->vex_x==a.maze_x&&q->vex_y==a.maze_y){if(print(q))printmazepath(q,a);sign=1;}else for(i=1;i<=4;i++)mazepath(q,i);}break;case 2:if(x+1<=a.maze_x&&!found(x+1,y,p)&&!a.Maze[x+1][y]){q=(Point*)malloc(sizeof(Point));q->vex_x=x+1;q->vex_y=y;q->next=p;p->direction=j;if(q->vex_x==a.maze_x&&q->vex_y==a.maze_y){if(print(q))printmazepath(q,a);sign=1;}else for(i=1;i<=4;i++)mazepath(q,i);}break;case 3:if(y-1>=1&&!found(x,y-1,p)&&!a.Maze[x][y-1]){q=(Point*)malloc(sizeof(Point));q->vex_x=x;q->vex_y=y-1;q->next=p;p->direction=j;if(q->vex_x==a.maze_x&&q->vex_y==a.maze_y){if(print(q))printmazepath(q,a);sign=1;}else for(i=1;i<=4;i++)mazepath(q,i);}break;case 4:if(x-1>=1&&!found(x-1,y,p)&&!a.Maze[x-1][y]){q=(Point*)malloc(sizeof(Point));q->vex_x=x-1;q->vex_y=y;q->next=p;p->direction=j;if(q->vex_x==a.maze_x&&q->vex_y==a.maze_y){if(print(q))printmazepath(q,a);sign=1;}else for(i=1;i<=4;i++)mazepath(q,i);}break;}}void main(){int i;Point *p;a=creat();p=(Point*)malloc(sizeof(Point));p->vex_x=1;p->vex_y=1;p->next=NULL;printf("\n递归求得迷宫所有可能通路.\n");for(i=1;i<=4;i++)mazepath(p,i);if(sign==0)printf("不能到达出口!\n");}运行结果:一共是九条路径,截图显示其中两条。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
cout<<"无解"<<endl;
}
else
{
int i, j;
for (i=0;i<row+2;i++)
{
for (j=0;j<col+2;j++)
{
if ((i==1 && j==1) || (i==desr && j==desc))
cout<<"第"<<count<<"条路径:"<<endl;
for (int i=0;i<path.size();i++)
cout<<"("<<path[i].row<<","<<path[i].col<<")";
cout<<"("<<des.row<<","<<des.col<<")";
result = 0;
while (!stk.empty())
stk.pop();
}
iscreate = false;
issolved = false;
pathlength = 0;
}
void Migong::OutputMaze()
{
if (!iscreate) return;
public:
Migong(){issolved=false;result=0;pathlength=row=col=0;iscreate=false;};
~Migong(){Release();};
bool Create(int* , int , int , int , int );
node nextnode;
for (int i=_S;i<_W+1;i++)
{
nextnode.row = beg.row + move[i].a;
nextnode.col = beg.col + move[i].b;
IsReachable(maze, mark, nextnode, des);
cout<<nblk;
else
cout<<blk;
}
cout<<endl;
}
}
/////////////////////////////
////迷宫相关数据结构的定义///
/////////////////////////////
struct offsets{
return true;
}
int& Matrix::operator ()(int r, int c)
{
return *(m+r*col+c);
}
void Matrix::Release()
{
if (iscreate)
{
row = col = 0;
if (m) delete[] m;
{
mark(1,1) = 1;
item temp;
temp.col = 1;
temp.row = 1;
temp.dir = _S;
stk.push(temp);
while (!stk.empty())
{
temp = stk.top();
stk.pop();
}
row = r;
col = c;
maze.Create(r+2, c+2);
mark.Create(r+2, c+2);
int i, j;
for (i=0;i<r+2;i++)
{
for (j=0;j<c+2;j++)
{
if (j==0 || j==c+1 || i==0 || i==r+1)
int a, b;
};
enum directions{
_S = 0,
_E,
_N,
_W
};
struct item{
int row, col, dir;
};
class Migong{
static offsets move[4];
Matrix maze;
m = 0;
}
iscreate = false;
}
void Matrix::Show(char blk='#', char nblk=' ')
{
int i, j;
for (i=0;i<row;i++)
ห้องสมุดไป่ตู้{
for (j=0;j<col;j++)
{
if (*(m+i*col+j) == 0)
cout<<endl;
return false;
}
if (maze(beg.row, beg.col)==1 || mark(beg.row, beg.col)==1)
{
return false;
}
path.push_back(beg);
mark(beg.row, beg.col) = 1;
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
#ifndef MIGONG_H
#define MIGONG_H
///////////////////
///////矩阵类//////
int& operator () (int, int);
int GetRow(){return row;};
int GetCol(){return col;};
void Release();
void Show(char, char );
};
bool Matrix::Create(int r, int c)
{
cout<<s;
}
else if (maze(i, j) == 1)
{
cout<<blk;
}else
{
if (IsInPath(i, j))
cout<<s;
else
cout<<' ';
}
}
cout<<endl;
}
}
}
//////////////////////
int count;
bool IsReachable( Matrix& maze, Matrix& mark, node beg, node des)
{
if (beg.row==des.row&&beg.col==des.col)
{//如果达到的话那么显示路径
count++;
stk.push(temp);
i = g;
j = h;
d = _S;//对一下个点进行搜索
}
else d++;
}
}
return false;
}
void Migong::Solve()
{
issolved = GetPath();
if (issolved)
{
return true;
}
//如果这个点不是障碍点且没有被搜索过那么可以对这个点进行搜索
if (maze(g, h)==0 && mark(g, h)==0)
{
mark(g, h) = 1;
temp.row = g;
temp.col = h;
temp.dir = d+1;
Matrix mark;
int row;
int col;
int desr;
int desc;
stack<item> stk;
bool iscreate;
int pathlength;
bool GetPath();
bool IsInPath(int, int);
int i = temp.row;
int j = temp.col;
int d = temp.dir;
while (d<4)
{//根据当前点的状态确定下一个搜索点
int g = i + move[d].a;
int h = j + move[d].b;
if (g==desr && h==desc)
//////穷举所有路径////
//////////////////////
offsets move[4]={ {1, 0}, {0, 1},