|
发表于 2014-1-31 16:24:15
|
显示全部楼层
本帖最后由 捞屎人 于 2014-2-1 21:05 编辑
nxc不支持递归吧
用纯c写了一个 有空 嫁接到nxc
#include<stdio.h>
#include<conio.h>
#define M 11
#define N 16
//设置迷宫,最外围1为墙 里边0为可走路径 1为障碍
int MiGong[M][N]=
{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1},
{1,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1},
{1,0,1,0,1,0,1,1,1,0,1,0,0,1,0,1},
{1,0,1,1,1,0,0,0,0,0,1,0,1,1,0,1},
{1,0,0,0,1,1,1,0,1,1,1,0,0,0,0,1},
{1,0,1,0,1,0,0,0,0,0,1,1,1,0,1,1},
{1,1,1,0,1,0,1,1,1,0,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,1},
{1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
int num,lj[M*N][3];
void ShuChu(int a[M][N])//打印地图函数
{
int i,j;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%d",a[j]);
printf("\n");
}
}
int XunLu(int QiDian[2],int MuBiao[2],int FangXiang[M*N][2])
{
int i,j,top=0,x,y,d,find,FangAn=0,ZuiYou=M*N,LuJing[M*N][2],DiTu[M][N];//d为设置方向,上下左右。find为设置找不找得到路
lj[top][0]=QiDian[0];
lj[top][1]=QiDian[1];
MiGong[QiDian[0]][QiDian[1]]=-1;
find=0;d=-1;
while(top>-1)
{
if(lj[top][0]==MuBiao[0]&&lj[top][1]==MuBiao[1])
{
FangAn++;
printf("方案%d共计%d步路径如下:\n",FangAn,top);
printf("出发:");
for(x=0;x<=top;x++)
{
printf("(%d,%d)→",lj[x][0],lj[x][1]);//把找到的路径输出
num++;
}
printf("结束\n");
if(ZuiYou>top)
{
ZuiYou=top;
for(i=0;i<ZuiYou;i++)
for(j=0;j<2;j++)
LuJing[j]=lj[j];
}
}
while(d<4&&find==0)
{
d++;
switch(d)
{
case 0:x=lj[top][0]-1; y=lj[top][1]; break;//方向为上
case 1:x=lj[top][0]; y=lj[top][1]+1;break;//方向为右
case 2:x=lj[top][0]+1; y=lj[top][1]; break;//方向为下
case 3:x=lj[top][0]; y=lj[top][1]-1;//方向为左
}
if(MiGong[x][y]==0)
find=1;
}
if(find==1)//判断是否找得到
{
lj[top][2]=d;
top++;
lj[top][0]=x;
lj[top][1]=y;
d=-1;find=0; //重新调整方向
MiGong[x][y]=-1;
}
else
{
MiGong[lj[top][0]][lj[top][1]]=0;
top--;d=lj[top][2]; //找不到的话退栈
}
}
for(i=0;i<M;i++)
for(j=0;j<N;j++)
DiTu[j]=MiGong[j];
for(i=0;i<ZuiYou;i++)
{
DiTu[LuJing[0]][LuJing[1]]=2;
FangXiang[0]=LuJing[i+1][0]-LuJing[0];
FangXiang[1]=LuJing[i+1][1]-LuJing[1];
}
printf("%d种方案,最佳路径%d步:\n",FangAn,ZuiYou);
ShuChu(DiTu);
return ZuiYou;
}
int main()
{
int l=0,k,i,j=1,QiDian[2]={1,1},MuBiao[2],FangXiang[M*N][2];
printf("迷宫地图:\n");
ShuChu(MiGong);
for(i=0;i<M*N;i++)
{
printf("起点:%d%4d\n",QiDian[0],QiDian[1]);
printf("输入目标:");
scanf("%d%d",&MuBiao[0],&MuBiao[1]);
if(MiGong[MuBiao[0]][MuBiao[1]]==0&&MuBiao[0]<M&&MuBiao[1]<N)
{
k=XunLu(QiDian,MuBiao,FangXiang);
QiDian[0]=MuBiao[0];
QiDian[1]=MuBiao[1];
printf("方向:",l++);
for(j=0;j<k-1;j++)
printf("(%d,%d)",FangXiang[j][0],FangXiang[j][1]);
printf("\n第%d次执行成功\n\n",l++);
}
else printf("错误!\n");
}
}
|
|