【文件属性】:
文件名称:C语言设计迷宫,找到所有路径及最短路径
文件大小:5KB
文件格式:C
更新时间:2018-10-17 09:25:52
迷宫
#include
#include
#define N1 9
#define N2 8
#define T N1*N2
#define M 4
char B[N1+1][N2+1];
int count=0; //记录路径条数
typedef struct node1
{
int a1;
int a2;
}find,direct[M+1];
typedef struct
{
int b1;
int b2;
int id;
}site;
typedef struct //顺序栈
{
site ht[T];
int top;
}Stack;
void Push(Stack *s,int a,int b)
{ s->top++;
s->ht[s->top].b1=a;
s->ht[s->top].b2=b;
}
void Gettop(Stack * s,int *a,int *b)
{ *a=s->ht[s->top].b1;
*b=s->ht[s->top].b2;
}
void create(char *a) //从文件读出迷宫(正确)
{
int i=0,j=0,p=1;
char x;
FILE *fp;
fp=fopen("in.txt","r");
if(fp==NULL)
{ printf("文件不能打开!\n");
exit(0);
}
x=fgetc(fp);
while(x!=EOF)
{ if(x=='0')
{ i++;
a[i]=x;
}
if(x=='1')
{ i++;
a[i]=x;
}
x=fgetc(fp);
}
printf(" ~~~~~~~生成迷宫~~~~~~~\n");
x=fgetc(fp);
while(p<=T) //用二维数组b记录迷宫每个位置是否可行
{ for(i=1;i<=N1;i++)
for(j=1;j<=N2;j++)
{ B[i][j]=a[p];
p++;
}
}
printf(" ");
printf("■■■■■■■■■■■■\n");
printf(" ■");
printf(" ■\n");
for(i=1;i<=N1;i++)
{ printf(" ");
printf("■ ");
for(j=1;j<=N2;j++)
{
if(B[i][j]=='0')
printf("□");
else
printf("■");
}
printf(" ■\n");
}
printf(" ■");
printf(" ■\n");
printf(" ");
printf("■■■■■■■■■■■■\n");
}
int search(int A1,int A2,int B1,int B2,Stack *s1,Stack *s2,direct p,char filename[])
{ int i,x=A1,y=A2,fun,min=T,id=0; //用min记录最短路径的长度
FILE *fp;
if(B[x][y]!='0')
{ printf("输入坐标不合法!\n");
return -1;
}
fp=fopen(filename,"a+");
if(fp==NULL)
{ printf("文件不能打开!\n");
exit(0);
}
fprintf(fp,"%s","所有路径:");
fprintf(fp,"%c",'\n');
Push(s1,x,y);
s1->ht[s1->top].id=id;
B[x][y]='*';
while(s1->top>0)
{ Gettop(s1,&x,&y);
id=s1->ht[s1->top].id;
if(x==B1&&y==B2)
{ count++;
fprintf(fp,"%d%c%c",count,':',' ');
printf("第 %d 条路径(长度为%d):\n",count,s1->top);
s1->ht[s1->top].id=0;
for(i=1;i<=s1->top;i++)
{
printf("(%d,%d,%d)->",s1->ht[i].b1,s1->ht[i].b2,s1->ht[i].id);
fprintf(fp,"%c%d%c%d%c%d%c%c",'(',s1->ht[i].b1,',',s1->ht[i].b2,',',s1->ht[i].id,')',' ');
if(i==0)
fprintf(fp,"%c%c%c%c",'\n',' ',' ',' ');
if(i%8==0)
printf("\n");
}
fprintf(fp,"%c",'\n');
printf("结束!\n\n");
if(s1->toptop=s1->top;
min=s1->top;
for(i=1;i<=s2->top;i++)
s2->ht[i]=s1->ht[i];
}
B[x][y]='0';
s1->top--; //退栈(s1->top--)
Gettop(s1,&x,&y);
id=s1->ht[s1->top].id;
}
fun=0;
while(id<=4) //能够找到没走过的通路
{ id++;
x=s1->ht[s1->top].b1;
y=s1->ht[s1->top].b2;
x=x+p[id].a1; y=y+p[id].a2;
if(x==0||y==0||x>N1||y>N2)
continue;
if(B[x][y]=='0')
{ fun=1;
break;
}
}
if(fun==1) //找到通路
{ s1->ht[s1->top].id=id;
Push(s1,x,y);
B[x][y]='*';
s1->ht[s1->top].id=0;
}
else
{ x=s1->ht[s1->top].b1;
y=s1->ht[s1->top].b2;
B[x][y]='0';
s1->top--;
}
}
if(count==0)
printf(" 无路径!\n");
else
{ printf("\n\n\n ");
printf("所有路径已存储在文件%s 中,请去查找!\n\n",filename);
}
return 1;
}
void Print(Stack *s2,char filename[])
{ int i;
FILE *fp;
fp=fopen(filename,"a+");
if(fp==NULL)
{ printf("文件不能打开!\n");
exit(0);
}
if(count!=0)
{ fprintf(fp,"%s","最短路径为:");
fprintf(fp,"%c",'\n');
printf(" ");
printf("%s\n","**********最短路径**********\n");
for(i=1;i<=s2->top;i++)
{ printf("(%d,%d,%d) ->",s2->ht[i].b1,s2->ht[i].b2,s2->ht[i].id);
fprintf(fp,"%c%d%c%d%c%d%c%c",'(',s2->ht[i].b1,',',s2->ht[i].b2,',',s2->ht[i].id,')',' ');
if(i==0)
fprintf(fp,"%c",'\n');
if(i%7==0)
printf("\n");
}
fprintf(fp,"%c",'\n');
printf("结束!\n");
printf("(最短路径长度: %d)\n",s2->top);
}
}
void main() //主函数
{
char a[T+1]; //二维数组b记录迷宫的每个位置
char filename1[20],filename2[20];
int x1,x2,y1,y2,k;
Stack *s1,*s2;
direct f1;
f1[1].a1=0; f1[1].a2=1; //判断方向(右)
f1[2].a1=1; f1[2].a2=0; //(下)
f1[3].a1=0; f1[3].a2=-1; //(左)
f1[4].a1=-1; f1[4].a2=0; //(上)
s1=(Stack *)malloc(sizeof(Stack));
s2=(Stack *)malloc(sizeof(Stack));
s1->top=0; //指向栈顶(初始化栈)
s2->top=0;
create(a);
printf("\n\n ");
printf("请输入入口坐标: ");
scanf("%d%d",&x1,&x2);
printf(" ");
printf("请输入出口坐标: ");
scanf("%d%d",&y1,&y2);
printf(" ");
printf("请输入存储所有路径的文件名:");
scanf("%s",filename1);
printf(" ");
printf("请输入存储最短路径的文件名:");
scanf("%s",filename2);
system("cls");
k=search(x1,x2,y1,y2,s1,s2,f1,filename1);
if(k==1)
Print(s2,filename2);
printf("\n");
}