简单的演示,N的大小可以改变的,而且这个程序的速度还可以,比以前我用递归写的那个快多了.假如N改得太大输出会有问题,因为我用到gotoxy的,这个程序主要是练一个算法,因为书上基本都是用柞走迷宫的,我用递归写个.迷宫地图是随机生成的,最短路径问题我没写进去,假如要写的话我觉得要用到我写黑白棋的那个程序,往8个方向判定是否有一直线上的,并且间隔中也都是有棋子的,大家交流下自己对迷宫的算法吧. #include <stdlib.h> #include <stdio.h> #include <conio.h> #define N 18 int aa[N][N];/*递归用的数组*/ int yes=0;/*判定是否找到路线的函数*/ int x[100][2],n=0;/*x数组是显示路线用的,n是它的下标,也就是走了几次*/ void fun1(int (*aa)[N],int (*a)[N]);/*重复赋值函数*/ int fun(int (*a)[N],int i,int j);/*递归找路算法函数*/ void begain(int (*t)[N]);/*开始的随机地图函数*/ void pr(int (*t)[N],int nn);/*输出地图函数*/ void win(int (*t)[N]);/*成功函数*/ void lose();/*失败函数*/ void main(void)/*主函数*/ { int t[N][N]; begain(t);/*开始*/ pr(t,0);/*开始输入地图*/ fun(t,1,1);/*递归找路*/ if(yes) win(t);/*成功*/ else lose();/*失败*/ getch(); } void fun1(int (*aa)[N],int (*a)[N])/*为了不同方式的递归而循环8次*/ { int i,j; for(i=0;i<N;i++) for(j=0;j<N;j++) aa[i][j]=a[i][j]; } int fun(int (*a)[N],int i,int j)/*递归找路*/ { if(i==N-2&&j==N-2)/*达到目的了*/ { yes=1; return; } a[i][j]=1;/*走到的地方变为0*/ fun1(aa,a); if(aa[i+1][j+1]==0&&!yes)/*右下,这里开始的8个if是8个方向的递归*/ { fun(aa,i+1,j+1); if(yes)/*假如到达目的了再把值给显示路线的数组*/ {x[n][0]=i,x[n++][1]=j;return;} } /*这里开始的7个函数具体同上函数*/ fun1(aa,a); if(aa[i+1][j]==0&&!yes)/*下边*/ { fun(aa,i+1,j); if(yes) {x[n][0]=i,x[n++][1]=j;return;} } fun1(aa,a); if(aa[i][j+1]==0&&!yes)/*右边*/ { fun(aa,i,j+1); if(yes) {x[n][0]=i,x[n++][1]=j;return;} } fun1(aa,a); if(aa[i-1][j]==0&&!yes) { fun(aa,i-1,j); if(yes) {x[n][0]=i,x[n++][1]=j;return;} } fun1(aa,a); if(aa[i-1][j+1]==0&&!yes) { fun(aa,i-1,j+1); if(yes) {x[n][0]=i,x[n++][1]=j;return;} } fun1(aa,a); if(aa[i+1][j-1]==0&&!yes) { fun(aa,i+1,j-1); if(yes) {x[n][0]=i,x[n++][1]=j;return;} } fun1(aa,a); if(aa[i][j-1]==0&&!yes) { fun(aa,i,j-1); if(yes) {x[n][0]=i,x[n++][1]=j;return;} } fun1(aa,a); if(aa[i-1][j-1]==0&&!yes) { fun(aa,i-1,j-1); if(yes) {x[n][0]=i,x[n++][1]=j;return;} } } void begain(int (*t)[N])/*开始的随机地图*/ { int i,j; system("cls"); randomize(); for(i=0;i<N;i++) { for(j=0;j<N;j++) { if(i==0||i==N-1||j==0||j==N-1) t[i][j]=1; else if(i==1&&j==1||i==N-2&&j==N-2) t[i][j]=0; else t[i][j]=random(2); } } } void pr(int (*t)[N],int nn)/*输出地图*/ { int i,j,ii; textcolor(RED); gotoxy(1,1); for(i=0;i<N;i++) { for(j=0;j<N;j++) { if(nn!=1)/*一开始的输出*/ printf("%2d",t[i][j]); else/*胜利后的输出*/ { for(ii=0;ii<n;ii++) { if(x[ii][0]==i&&x[ii][1]==j) { cprintf("%2d",t[i][j]); break; } } if(ii<n) continue; if(i==N-2&&j==N-2) cprintf(" 0"); else printf("%2d",t[i][j]); } } printf("\n"); } } void win(int (*t)[N])/*找到路的话*/ { int i,j,ii,jj; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(x[j][0]==x[i][0]&&x[j][1]==x[i][1]) { for(jj=j,ii=i;jj<n;jj++,ii++) {x[ii][0]=x[jj][0];x[ii][1]=x[jj][1];} n=n-(j-i); } printf("\nThe way is:\n"); for(i=n-1;i>=0;i--)/*应该递归的情况所以应该是反过来输入路线*/ printf("%3d%3d->",x[i][0],x[i][1]); printf("%3d%3d\n",N-2,N-2); t[1][1]=0; pr(t,1); } void lose()/*没路的话*/ { printf("\nNot find way!\n"); }
视频教程列表
文章教程搜索
C语言程序设计推荐教程
C语言程序设计热门教程
|