当前位置:编程学习 > C/C++ >>

C语言迷宫问题,用栈来做

要求是用C语言,最好用栈的知识,输入m*n,自动生成迷宫,并找到可行的通道,没有的话就输出没有。

请不要复制的来,调试好发过来,谢谢,今晚12:00截止。

追问:程序有问题,不能运行,而且我要的是随机输入m*n,并不是固定的,程序还要自动生成迷宫,抱歉不能给你分- -
答案:#include <stdio.h>
#include <mem.h>

void main()
{
int a[100][100]; //0:blocked 1:passage 2:finish -1:visited;
int b[10000][2];
int m=0,n=0;
int sttop=0;
int i,j,k,l;
memset(a,0,sizeof(a));
printf("Please Input m,n:");
scanf("%d%d",&m,&n);
printf("Input the start:");
scanf("%d%d",&i,&j);
b[0][0]=i-1;
b[0][1]=j-1;
printf("Input the Map:\n");
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
printf("Input the Finish:");
scanf("%d%d",&i,&j);
a[i-1][j-1]=2;
i=b[sttop][0];j=b[sttop][1];
a[i][j]=-1;
while (sttop!=-1)
{
if (i>0)
{ //can up?
if (a[i-1][j]==1)
{
a[--i][j]=-1;
b[++sttop][0]=i;
b[sttop][1]=j;
continue;
}else
if (a[i-1][j]==2)
{
b[++sttop][0]=--i;
b[sttop][1]=j;
break;
}
}
if (i<m-1)
{ //can up?
if (a[i+1][j]==1)
{
a[++i][j]=-1;
b[++sttop][0]=i;
b[sttop][1]=j;
continue;
}else
if (a[i+1][j]==2)
{
b[++sttop][0]=++i;
b[sttop][1]=j;
break;
}
}
if (j>0)
{ //can left?
if (a[i][j-1]==1)
{
a[i][--j]=-1;
b[++sttop][0]=i;
b[sttop][1]=j;
continue;
}else
if (a[i][j-1]==2)
{
b[++sttop][0]=i;
b[sttop][1]=--j;
break;
}
}
if (j<m-1)
{ //can up?
if (a[i][j+1]==1)
{
a[i][++j]=-1;
b[++sttop][0]=i;
b[sttop][1]=j;
continue;
}else
if (a[i][j+1]==2)
{
b[++sttop][0]=i;
b[sttop][1]=j++;
break;
}
}
sttop--;
}
if (sttop+1)
{
for (i=0;i<sttop;i++)
printf("(%d,%d)->",b[i][0]+1,b[i][1]+1);
printf("(%d,%d)\n",b[i][0]+1,b[i][1]+1);
}
else
printf("Can't Reach The Finish Spot!\n");
return;
}

用非嵌套的方法做的栈,起点 终点自己定

输入数据规则如下:

先输入m n(m为行数,n为列数)

再输入起点(最左上角为(1,1)(前者行号,后者列号)则输入"1 1"(不含引号)其他依次类推)

再输入地图(0为被阻挡,1为通路)(起点被默认为通路,无论输入0还是1)

再输入终点(规则和起点一样)

回车后出结果,结果的表达方式以(x,y)->(x,y)->....->(x,y)(坐标任以1,1为左上角)

或者Can't Reach The Finish Spot!

呈现

其他的修改的话可以随便咯(规模m,n<=100,太大栈放不下了)

#include"stdio.h"
#include"stdlib.h"
#define m 8
#define n 6
#define maxsize 50
int maze[m+2][n+2];

typedef struct/*试探方向*/
{ int x,y;
}item;
item move[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};

typedef struct/*栈元素设计*/
{int x,y,d;
}datetype;

typedef struct/*栈*/
{datetype data[maxsize];
int top;
}SeqStack;

SeqStack *Init_SeqStack()/*置空栈*/
{SeqStack *s;
s=(SeqStack *)malloc(sizeof(SeqStack));
s->top=0;return s;
}

int Empty_SeqStack(SeqStack *s)/*判栈空*/
{if(s->top==0)return 1;
else return 0;
}

int Push_SeqStack(SeqStack *s,datetype x)/*入栈*/
{if(s->top==maxsize-1)return 0;
else{s->top++;
s->data[s->top]=x;return 1;}
}

int Pop_SeqStack(SeqStack *s,datetype *x)/*出栈*/
{if(Empty_SeqStack(s))return 0;
else {*x=s->data[s->top];
s->top--; return 1;}
}

int path(SeqStack *s)/*寻找路径*/
{
datetype temp;
int x,y,d,i,j;
temp.x=1;temp.y=1;temp.d=-1;
Push_SeqStack (s,temp);
while (!Empty_SeqStack(s))
{Pop_SeqStack (s,&temp);
x=temp.x;y=temp.y;d=temp.d+1;
while (d<4)
{i=x+move[d].x;j=y+move[d].y;
if (maze[i][j]==0)
{temp.x=x;temp.y=y;temp.d=d;
Push_SeqStack (s,temp);
x=i;y=j;maze[x][y]=-1;
if (x==m&&y==n)
return 1;
else d=0;
}
else d++;
}
}return 0;
}

void print(SeqStack *s)/*输出栈*/
{int i;
for(i=1;i<=s->top;i++)
{printf("{[%d,%d],%d}", s->data[i].x,s->data[i].y,s->data[i].d);
if(i<s->top)printf("→");
if(i%3==0) printf("\n");
}
printf("\n");
}

int main()
{SeqStack *s ;
int i,k,j,w;

printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" 数据结构课程设计-迷宫问题 \n");
printf(" ------------------------- \n");
printf(" 1--随机迷宫 \n");

printf(" 0--退出 \n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");

scanf("%d",&w);
switch(w)
{case 1:for( i = 1; i <=m;i++ )
for(j=1;j<=n;j++)
{maze[i][j]=rand()%2;/*随机数组*/
}
maze[1][1]=0;maze[6][8]=0;/*入口和出口*/
for(i=0;i<m+2;i++) /*添加外围*/
{maze[i][0]=1;maze[i][n+1]=1;
}
for (j=0;j<n+2;j++)
{maze[0][j]=1;maze[m+1][j]=1;
}
printf("随机生成的迷宫图为:\n\n");
for(i=0;i<m+2;i++)
{for(j=0;j<n+2;j++)
printf("%2d ",maze[i][j]);
printf("\n");
}
s=Init_SeqStack();
k=path(s);
if (k==1)
{if(k==1)
printf("迷宫有路:\n");
print(s);
for(i=0;i<m+2;i++)
{for(j=0;j<n+2;j++)
printf("%2d ",maze[i][j]);
printf("\n");
}}
else
printf("迷宫没路\n\n");
break;

}

getch();
}

貌似是这样的 ~~

上一个:求一简单的C语言动画程序。
下一个:谁能帮我解说下C语言程序

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,