用C++设置个迷宫求解程序..
小弟在网上 复制修改了一遍 但有些程序还是看不懂希望大神帮帮忙.
#include"stdlib.h"
#include"stdio.h"
#define N 10
#define M 10
int X;
int maze[N+2][M+2];
struct point
{
int row,col,predecessor; //row行,column列,predecesser前任
}
queue[512];
int head=0,tail=0; //head头,tail尾
void shoudong_maze(int m,int n)// 手动迷宫函数... m和n为形参
{
int i,j;
printf("\n\n");
printf("请按行输入迷宫,0表示通路,1表示障碍:\n\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&maze[i][j]);
}
void print_maze(int m,int n) //迷宫输出函数
{
int i,j;
printf("\n迷宫生成结果如下:\n\n");
printf("入口\n");
printf("↓");
for(i=0;i<m;i++)
{printf("\n");
for(j=0;j<n;j++)
{if(maze[i][j]==0) printf("0");
if(maze[i][j]==1) printf("1");}
}
printf("→出口\n");
}
void result_maze(int m,int n){ //迷宫有解函数
int i,j;
printf("迷宫通路(用8表示)如下所示:\n\t");
for(i=0;i<m;i++)
{printf("\n");
for(j=0;j<n;j++)
{if(maze[i][j]==0||maze[i][j]==2) printf("0");
if(maze[i][j]==1) printf("1");
if(maze[i][j]==3) printf("8");
}
}
}
void enqueue(struct point p){
queue[tail]=p;
tail++;
}
struct point dequeue(){
head++;
return queue[head-1];
}
int is_empty(){
return head==tail;
}
void visit(int row,int col,int maze[12][12]){
struct point visit_point={row,col,head-1};
maze[row][col]=2;
enqueue(visit_point);
}
int mgpath(int maze[12][12],int m,int n){
X=1;
struct point p={0,0,-1};
if(maze[p.row][p.col]==1)
printf("此迷宫无解\n\n");X=0;return 0;}
maze[p.row][p.col]=2;
enqueue(p);
while(!is_empty())
{p=dequeue();
if((p.row==m-1)&&(p.col==n-1)) break;
if((p.col+1<n)&&(maze[p.row][p.col+1]==0)) visit(p.row,p.col+1,maze);
if((p.row+1<m)&&(maze[p.row+1][p.col]==0)) visit(p.row+1,p.col,maze);
if((p.col-1>=0)&&(maze[p.row][p.col-1]==0)) visit(p.row,p.col-1,maze);
if((p.row-1>=0)&&(maze[p.row-1][p.col]==0)) visit(p.row-1,p.col,maze);
}
if(p.row==m-1&&p.col==n-1) //迷宫有出路
printf("迷宫路径为:\n");
printf("(%d,%d)\n",p.row,p.col);
maze[p.row][p.col]=3;
while(p.predecessor!=-1)
{p=queue[p.predecessor];
printf("(%d,%d)\n",p.row,p.col);
maze[p.row][p.col]=3;
}
}
else
printf("此迷宫无解!\n\n");X=0;}
return 0;
}
void main()
{int i,m,n,cycle=0;
while(cycle!=(-1))
{
printf("\n");
printf("\n");
printf(" 欢迎进入迷宫寻路系统 \n");
printf(" 手动生成迷宫请按1: \n");
printf(" 退出请按2: \n");
printf("请选择你的操作:\n");
scanf("%d",&i);
switch(i)
{case 1:printf("\n请输入行数:");
scanf("%d",&m);
printf("\n");
printf("请输入列数:");
scanf("%d",&n);
while((m<=0||m>10)||(n<=0||n>10))
{printf("\n抱歉,你输入的行列数超出预设范围(0-10,0-10),请重新输入:\n\n");
printf("请输入行数:");
scanf("%d",&m);
printf("\n");
printf("请输入列数:");
scanf("%d",&n);
}
shoudong_maze(m,n);
print_maze(m,n);
mgpath(maze,m,n);
if(X!=0) result_maze(m,n);
printf("\n\nPressEnterContiue!\n");getchar();while(getchar()!='\n');break;
case 2:cycle=(-1);break;
default:printf("\n");
printf("你的输入有误!\n");
printf("\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break;
}
}
}
分割线----------------------------------------------------
现在小弟看不懂
int mgpath()
void visit()
这两个函数什么有什么用..怎么实现的 希望大神帮忙看看.
[解决办法]
int mgpath() 使用广度遍历在迷宫中搜索一条路径.
visit() 把迷宫中对应的点设置为已访问状态, 并把它加入到队列中
[解决办法]
看到很长的代码就不想看,先mark。然后看