回 帖 发 新 帖 刷新版面

主题:[讨论]探索迷宫的所有路径有问题,希望高手指点一下

#include <stdio.h>
struct path{
    int x,y,c;
}pa[400];
int m,n;
int k,l;
void print(int a[20][20],struct path pa[400]);
void way(int a[20][20],struct path pa[400],int x,int y,int i);
main()
{
    int a[20][20]={0},b[20][20]={0};
    int i,j,u,o;
    
    scanf("%d,%d",&k,&l);
    for(i=0;i<l+2;i++){
        a[0][i]=a[k+1][i]=1;
    }
    for(i=0;i<k+2;i++){
        a[i][0]=a[i][l+1]=1;
    }
    for(i=1;i<k+1;i++){
        for(j=1;j<l+1;j++){
            scanf("%d",&a[i][j]);
            b[i][j]=a[i][j];
    }}
for(i=0;i<=k+1;i++){
        for(j=0;j<=l+1;j++){
            printf(" %d",a[i][j]);
    }
    printf("\n");
    }

    scanf("%d,%d %d,%d",&u,&o,&m,&n);
    way(a,pa,o,u,0);
}



void print(int a[20][20],struct path pa[400])
{
    int i,j;
    int count=0;
    for(i=1;i<k+1;i++){
        for(j=1;j<l+1;j++){
            if(!a[i][j] && pa[count].x==i && pa[count].y==j)
            {printf(" 2");count++;}
            else if(a[i][j]) printf(" 1");
            else printf("  ");
        }
        printf("\n");
    }
}
void way(int a[20][20],struct path pa[400],int x,int y,int i)
{
    pa[i].x=x;
    pa[i].y=y;
    pa[i].c=0; printf("%d %d\n",x,y);        
    if(x==m && y==n){
        print(a,pa);
        return;
    }getchar();        
Try: pa[i].c++;
     if(pa[i].c<5){
         switch(pa[i].c)
         {
         case 1:
             if(!a[x+1][y]) way(a,pa,x+1,y,i+1);
             goto Try;
         case 2:
             if(!a[x-1][y]) way(a,pa,x-1,y,i+1);
             goto Try;
         case 3:
             if(!a[x][y+1]) way(a,pa,x,y+1,i+1);
             goto Try;
         case 4:
             if(!a[x][y-1]) way(a,pa,x,y-1,i+1);
             goto Try;
         }
     }

         
         pa[i].x=0;
         pa[i].y=0;
         return ;
     
}


回复列表 (共3个回复)

沙发

请说明详细点。。错在哪,这个写法的思路,以及注释。。。

板凳

#include <stdio.h>
struct path{
    int x,y,c;
}pa[400];//记录路径
int m,n,u,o;//m,n记录终点,u,o记录起点
int k,l;  //记录迷宫大小
void print(int a[20][20],struct path pa[400]);
void way(int a[20][20],struct path pa[400],int x,int y,int i);
main()
{
    int a[20][20]={0},b[20][20]={0};
    int i,j;

  //做迷宫的边框  
    scanf("%d,%d",&k,&l);
    for(i=0;i<l+2;i++){
        a[0][i]=a[k+1][i]=1;
    }
    for(i=0;i<k+2;i++){
        a[i][0]=a[i][l+1]=1;
    }
    for(i=1;i<k+1;i++){
        for(j=1;j<l+1;j++){
            scanf("%d",&a[i][j]);
            b[i][j]=a[i][j];
    }}

//输入迷宫
for(i=0;i<=k+1;i++){
        for(j=0;j<=l+1;j++){
            printf(" %d",a[i][j]);
    }
    printf("\n");
    }


//输入起点
    scanf("%d,%d %d,%d",&u,&o,&m,&n);


    way(a,pa,o,u,0);
}


//打印路径
void print(int a[20][20],struct path pa[400])
{
    int i,j;
    int count=0;
    for(i=1;i<k+1;i++){
        for(j=1;j<l+1;j++){
            if(!a[i][j] && pa[count].x==i && pa[count].y==j)
            {printf(" 2");count++;}
            else if(a[i][j]) printf(" 1");
            else printf("  ");
        }
        printf("\n");
    }
}
void way(int a[20][20],struct path pa[400],int x,int y,int i)
{
    pa[i].x=x;
    pa[i].y=y;
    pa[i].c=0;
    printf("%d %d %d",x,y,i);getchar();//调试工具,打印此时传入的参数
    
    //如果是终点,打印函数,并结束函数
    if(x==m && y==n){
        print(a,pa);
        return;
    }
    
    //试探该点的各个方向
Try: pa[i].c++;
     if(pa[i].c<5){
         switch(pa[i].c)
         {
         case 1:
             if(!a[x+1][y]) way(a,pa,x+1,y,i+1);
             goto Try;//试探完该方向后,继续试探另外的方向
         case 2:
             if(!a[x-1][y]) way(a,pa,x-1,y,i+1);
             goto Try;
         case 3:
             if(!a[x][y+1]) way(a,pa,x,y+1,i+1);
             goto Try;
         case 4:
             if(!a[x][y-1]) way(a,pa,x,y-1,i+1);
             goto Try;
         }
     }

      //   试探完后,将该点初始化
         pa[i].x=0;
         pa[i].y=0;
         return ;
     
}
可试输入3,3(迷宫大小)
0 1 1(迷宫地图)
0 0 0
1 0 0
1,1(起点)
3,3(终点)

3 楼

#include <stdio.h>
struct path{
    int x,y,c;
}pa[400];
int m,n;
int k,l;
void print(int a[20][20],struct path pa[400]);
void way(int a[20][20],struct path pa[400],int x,int y,int i);
main()
{
    int a[20][20]={0},b[20][20]={0};
    int i,j,u,o;
    
    scanf("%d,%d",&k,&l);
    for(i=0;i<l+2;i++){
        a[0][i]=a[k+1][i]=1;
    }
    for(i=0;i<k+2;i++){
        a[i][0]=a[i][l+1]=1;
    }
    for(i=1;i<k+1;i++){
        for(j=1;j<l+1;j++){
            scanf("%d",&a[i][j]);
            b[i][j]=a[i][j];
    }}
for(i=0;i<=k+1;i++){
        for(j=0;j<=l+1;j++){
            printf(" %d",a[i][j]);
    }
    printf("\n");
    }

    scanf("%d,%d %d,%d",&u,&o,&m,&n);
    way(a,pa,o,u,0);
}



void print(int a[20][20],struct path pa[400])
{
    int i,j;
    int count=0;
    for(i=1;i<k+1;i++){
        for(j=1;j<l+1;j++){
            if(a[i][j]==-1 && pa[count].x==i && pa[count].y==j)
            {printf(" 2");count++;}
            else if(a[i][j]) printf(" 1");
            else printf("  ");
        }
        printf("\n");
    }
}
void way(int a[20][20],struct path pa[400],int x,int y,int i)
{
    pa[i].x=x;
    pa[i].y=y;
    pa[i].c=0; 
    a[x][y]=-1;//printf("%d %d\n",x,y);    getchar();    
    if(x==m && y==n){
        print(a,pa);putchar('\n');
        return;
    }    
Try: pa[i].c++;
     if(pa[i].c<5){
         switch(pa[i].c)
         {
         case 1:
             if(!a[x+1][y]){ way(a,pa,x+1,y,i+1);
             a[x+1][y]=0;}
             goto Try;
         case 2:
             if(!a[x-1][y]){ way(a,pa,x-1,y,i+1);
             a[x-1][y]=0;}
             goto Try;
         case 3:
             if(!a[x][y+1]){ way(a,pa,x,y+1,i+1);
             a[x][y+1]=0;}
             goto Try;
         case 4:
             if(!a[x][y-1]){ way(a,pa,x,y-1,i+1);
             a[x][y-1]=0;}
             goto Try;
         }
     }

         
         pa[i].x=0;
         pa[i].y=0;
         return ;
     
}
所有路径
程序已经解决

我来回复

您尚未登录,请登录后再回复。点此登录或注册