迷宫程序
idler 2004-12-18 11:19:43 偶朋友拜托偶帮忙的。。。偶今天出去喝喜酒看不了。。。各位兄弟帮忙解决。
200分不打折滴。。。回贴写修改点,能加说明最好。。。多谢^_^
//可能性:假死循环:运算时间很长,似乎进入死循环
//不要用c++语句
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
void setmaze(int);
void move(int,int);
void path(int,int);
int **m,n,times;//times?似乎没用到
int count=2;//道路步数
int maincount=2;//主道路步数
int flag=1;
main()
{
int i,j;
printf("input the diameter(10-30):");
scanf("%d",&n);
//以下申请二维数组
m=(int**)malloc(2*n*n*sizeof(int*));
if(m==NULL){
printf("memory request failed\n");
exit(-1);
}
for(j=0;j<2*n;j++)//注意这里是2*n,为了视觉效果好
m[j]=(int*)malloc(2*n*sizeof(int));
//初始化迷宫
for(i=0;i<n;i++)
for(j=0;j<2*n;j++)
m[i][j]=1;
for(i=0;i<n;i+=n-1)
for(j=0;j<2*n;j++)
m[i][j]=2;
for(j=0;j<2*n;j+=2*n-1)
for(i=1;i<n-1;i++)
m[i][j]=2;
setmaze(n);
}
void setmaze(n)
{
int i,j;
m[0][1]=0;m[1][1]=0;//先走两步
move(1,1);//建立主道路
//找道路点,建立分支道路,直到道路走过的步数达到迷宫面积数的一半
while(count<=n*n){
srand(time(00));
do
{
i=rand()%n;j=rand()%(2*n);
}
while(m[i][j]!=0);//找到道路上的点
path(i,j);
}
//输出迷宫
for(i=0;i<n;i++){
printf("\t");
for(j=0;j<2*n;j++)
printf("%d",m[i][j]);
printf("\n");}
}
void move(int x,int y)
{
int direct;
srand(time(00));//这句是否用对,是否应放在这里
flag=1;//这里改为int flag=1后程序无错,但只有m[0][1]=0;m[1][1]=0;其余没变化
//选择一个方向,做判断后再走
direct=rand()%4;
switch(direct){
case 0://向上
if(x>=1){//不在最顶端
if(m[--x][y]==2){//上面是墙壁
if(maincount<=5*n) //走的步数太少
{x++;move(x,y);}//回复,叠代
else flag=0;}//上面是墙壁,且走的步数够多,结束
else m[x][y]=0;}//上面不是墙壁,走过去
break;
case 1://向左
if(y>=1){
if(m[x][--y]==2){
if(maincount<=5*n) {y++;move(x,y);}
else flag=0;}
else m[x][y]=0;}break;
case 2://向下
if(x<n-1){
if(m[++x][y]==2){
if(maincount<=5*n) {x--;move(x,y);}
else flag=0;}
else m[x][y]=0;}break;
case 3://向右
if(y<2*n-1){
if(m[x][++y]==2){
if(maincount<=5*n) {y--;move(x,y);}
else flag=0;}
else m[x][y]=0;}break;
}
maincount++;count++;
if(flag!=0)move(x,y);//没碰到墙壁或者走的步数不够,再走
else return;
}
void path(int x,int y)
{
int direct;
flag=1;
srand(time(00));
//选择方向,判断后再走
direct=rand()%4;
switch(direct){
case 0://向上
if((abs(x)<=2)&&(abs(x-n+1)<=2)&&(abs(y)<2)&&(abs(y-2*n)<=2)) //离边界有一定距离
flag=0;
else m[--x][y]=0;
break;
case 1://向左
if((abs(x)<=2)&&(abs(x-n+1)<=2)&&(abs(y)<2)&&(abs(y-2*n)<=2)) flag=0;
else m[x][--y]=0;break;
case 2://向下
if((abs(x)<=2)&&(abs(x-n+1)<=2)&&(abs(y)<2)&&(abs(y-2*n)<=2)) flag=0;
else m[++x][y]=0;break;
case 3://向右
if((abs(x)<=2)&&(abs(x-n+1)<=2)&&(abs(y)<2)&&(abs(y-2*n)<=2)) flag=0;
else m[x][++y]=0;break;
}
count++;
if(flag!=0)path(x,y);//当前点离边界有一定距离,再走
else return;//走到边界,返回
}