首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

用C++设立个迷宫求解程序.

2013-07-09 
用C++设置个迷宫求解程序..小弟在网上 复制修改了一遍 但有些程序还是看不懂希望大神帮帮忙.#includestdl

用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。然后看

热点排行