要求是用C语言,最好用栈的知识,输入m*n,自动生成迷宫,并找到可行的通道,没有的话就输出没有。
请不要复制的来,调试好发过来,谢谢,今晚12:00截止。
要求是用C语言,最好用栈的知识,输入m*n,自动生成迷宫,并找到可行的通道,没有的话就输出没有。
请不要复制的来,调试好发过来,谢谢,今晚12:00截止。
#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(); }
貌似是这样的 ~~