标题:迷宫问题很容易的了 我还是想不通
只看楼主
童国顺
Rank: 1
等 级:新手上路
帖 子:70
专家分:6
注 册:2010-4-18
结帖率:60%
 问题点数:0 回复次数:9 
迷宫问题很容易的了 我还是想不通
#include<stdio.h>
#define m 4
#define n 4
#define maxsize 10
int mg[m+2][n+2]={
    {1,1,1,1,1,1},
    {1,0,0,0,1,1},
    {1,0,1,0,0,1},
    {1,0,0,0,1,1},
    {1,1,0,0,0,1},
    {1,1,1,1,1,1}
};
struct
{
    int i;int j;int di;
}stack[maxsize],path[maxsize];
int top=-1;
int count=1;
int minlen=maxsize;
void mgpath()
{
    int i,j,di,find,k;
    top++;stack[top].i=1;stack[top].j=1;stack[top].di=-1;mg[1][1]=-1;
    while(top>-1)
    {
        i=stack[top].i;j=stack[top].j;di=stack[top].di;
       if(i==m&&j==n)
       {
        printf("%4d:",count++);
        for(k=0;k<=top;k++)
        {
            printf("(%d,%d) ",stack[k].i,stack[k].j);
            if((k+1)%5==0)printf("\n\t");
        }
        printf("\n");
       /* if(top+1<minlen)
        {
            
            for(k=0;k<=top;k++)
                path[k]=stack[k];
            minlen=top+1;
        
        }*/
        mg[stack[top].i][stack[top].j]=0;
        top--;
        i=stack[top].i;j=stack[top].j;di=stack[top].di;
    }
    find=0;
    while(di<4&&find==0)
    {
        di++;
        switch(di)
        {
        case 0:i=stack[top].i-1;j=stack[top].j;break;
        case 1:i=stack[top].i;j=stack[top].j+1;break;
        case 2:i=stack[top].i+1;j=stack[top].j;break;
        case 3:i=stack[top].i;j=stack[top].j-1;break;
        }
        if(mg[i][j]==0) find=1;
    }
    if(find==1)
    {
        stack[top].di=di;
        top++;
        stack[top].i=i;
        stack[top].j=j;
        stack[top].di=-1;
        mg[i][j]=-1;
    }
    else
    {
        mg[stack[top].i][stack[top].j]=0;
        top--;
    }
}
printf("最长路径如下:\n");
//printf("长度:   %d\n",minlen);
printf("路径:");
//for(k=0;k<minlen;k++)
//{
//    printf("(%d,%d)",path[k].i,path[k].j);
//    if((k+1)%5==0) printf("\n\t");
//}
printf("\n");
}
void main()
{
    printf("迷宫是有路径如下:\n");
    mgpath();
}
输出有四条路径。。。。我想显示那个最长的那条路径 怎么改呢!!!!!谢谢!!!!!
搜索更多相关主题的帖子: include count 
2011-04-02 20:07
童国顺
Rank: 1
等 级:新手上路
帖 子:70
专家分:6
注 册:2010-4-18
得分:0 
帮我想想啊!!!!!
2011-04-03 07:53
童国顺
Rank: 1
等 级:新手上路
帖 子:70
专家分:6
注 册:2010-4-18
得分:0 
版主来??????帮下了 谢谢!!!!
2011-04-03 11:07
童国顺
Rank: 1
等 级:新手上路
帖 子:70
专家分:6
注 册:2010-4-18
得分:0 
做了非常感谢了。。。。。不可能没有人不会 啊!哎!!!!帮下了
2011-04-03 11:49
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:0 
每次走到出口的时候比较下步数,如果步数大于以前走到路口的步数 就把这种走法存下来 跟新最大步数  就这么简单

#include<stdio.h>
#define m 4
#define n 4
#define maxsize 10
int mg[m+2][n+2]={
    {1,1,1,1,1,1},
    {1,0,0,0,1,1},
    {1,0,1,0,0,1},
    {1,0,0,0,1,1},
    {1,1,0,0,0,1},
    {1,1,1,1,1,1}
};
struct
{
    int i;int j;int di;
}stack[maxsize],path[maxsize],num[maxsize];
int top=-1;
int count=1;
int minlen=maxsize;
int max=0,v;
void mgpath()
{
    int i,j,di,find,k;
    top++;stack[top].i=1;stack[top].j=1;stack[top].di=-1;mg[1][1]=-1;
    while(top>-1)
    {
        i=stack[top].i;j=stack[top].j;di=stack[top].di;
       if(i==m&&j==n)
       {
          printf("%4d:",count++);
          if(count>max){
              max=count;
              v=top;
              for(k=0;k<=top; ++k){
                num[k].i=stack[k].i;
                num[k].j=stack[k].j;
              }
          }
         for(k=0;k<=top;k++)
        {
           printf("(%d,%d) ",stack[k].i,stack[k].j);
            if((k+1)%5==0)printf("\n\t");
        }
        printf("\n");
       /* if(top+1<minlen)
        {
            
            for(k=0;k<=top;k++)
                path[k]=stack[k];
            minlen=top+1;
        
        }*/
        mg[stack[top].i][stack[top].j]=0;
        top--;
        i=stack[top].i;j=stack[top].j;di=stack[top].di;
    }
    find=0;
    while(di<4&&find==0)
    {
        di++;
        switch(di)
        {
        case 0:i=stack[top].i-1;j=stack[top].j;break;
        case 1:i=stack[top].i;j=stack[top].j+1;break;
        case 2:i=stack[top].i+1;j=stack[top].j;break;
        case 3:i=stack[top].i;j=stack[top].j-1;break;
        }
        if(mg[i][j]==0) find=1;
    }
    if(find==1)
    {
        stack[top].di=di;
        top++;
        stack[top].i=i;
        stack[top].j=j;
        stack[top].di=-1;
        mg[i][j]=-1;
    }
    else
    {
        mg[stack[top].i][stack[top].j]=0;
        top--;
    }
}
printf("最长路径如下:\n");
//printf("长度:   %d\n",minlen);
printf("路径:");
//for(k=0;k<minlen;k++)
//{
//    printf("(%d,%d)",path[k].i,path[k].j);
//    if((k+1)%5==0) printf("\n\t");
//}
printf("\n");
}
void main()
{
    int k;
    printf("迷宫是有路径如下:\n");
    mgpath();
    printf("最长路径: \n");
    printf("步数:%d   走法:" ,max);
    for(k=0;k<=v;k++)
    {
        printf("(%d,%d) ",stack[k].i,stack[k].j);
        if((k+1)%5==0)printf("\n\t");
    }
        printf("\n");
}
2011-04-03 12:46
童国顺
Rank: 1
等 级:新手上路
帖 子:70
专家分:6
注 册:2010-4-18
得分:0 
不正确的啊!!!!你得到的结果是5 也不是最长的路径啊!
2011-04-03 16:36
童国顺
Rank: 1
等 级:新手上路
帖 子:70
专家分:6
注 册:2010-4-18
得分:0 
不正确啊!!!大哥
2011-04-03 16:57
童国顺
Rank: 1
等 级:新手上路
帖 子:70
专家分:6
注 册:2010-4-18
得分:0 
我要的结果是长度是九  路径就是9个坐标
2011-04-03 17:08
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:0 
思想不是给你了啊  你都不会自己想想啊- -
上面那个是错了- -错在我吧count以为是步数了  - -
#include<stdio.h>
 #define m 4
 #define n 4
 #define maxsize 10
 int mg[m+2][n+2]={
     {1,1,1,1,1,1},
     {1,0,0,0,1,1},
     {1,0,1,0,0,1},
     {1,0,0,0,1,1},
     {1,1,0,0,0,1},
     {1,1,1,1,1,1}
 };
 struct
 {
     int i;int j;int di;
 }stack[maxsize],path[maxsize],num[maxsize];
 int top=-1;
 int count=1;
 int minlen=maxsize;
 int max=0,v;
 void mgpath()
 {
     int i,j,di,find,k;
     top++;stack[top].i=1;stack[top].j=1;stack[top].di=-1;mg[1][1]=-1;
     while(top>-1)
     {
         i=stack[top].i;j=stack[top].j;di=stack[top].di;
        if(i==m&&j==n)
        {
           printf("%4d:",count++);
           if(top>max){
               max=top;
               for(k=0;k<=top; ++k){
                 num[k].i=stack[k].i;
                 num[k].j=stack[k].j;
               }
           }
          for(k=0;k<=top;k++)
         {
            printf("(%d,%d) ",stack[k].i,stack[k].j);
             if((k+1)%5==0)printf("\n\t");
         }
         printf("\n");
        /* if(top+1<minlen)
         {
            
             for(k=0;k<=top;k++)
                 path[k]=stack[k];
             minlen=top+1;
         
         }*/
         mg[stack[top].i][stack[top].j]=0;
         top--;
         i=stack[top].i;j=stack[top].j;di=stack[top].di;
     }
     find=0;
     while(di<4&&find==0)
     {
         di++;
         switch(di)
         {
         case 0:i=stack[top].i-1;j=stack[top].j;break;
         case 1:i=stack[top].i;j=stack[top].j+1;break;
         case 2:i=stack[top].i+1;j=stack[top].j;break;
         case 3:i=stack[top].i;j=stack[top].j-1;break;
         }
         if(mg[i][j]==0) find=1;
     }
     if(find==1)
     {
         stack[top].di=di;
         top++;
         stack[top].i=i;
         stack[top].j=j;
         stack[top].di=-1;
         mg[i][j]=-1;
     }
     else
     {
         mg[stack[top].i][stack[top].j]=0;
         top--;
     }
 }
 printf("最长路径如下:\n");
 //printf("长度:   %d\n",minlen);
 printf("路径:");
 //for(k=0;k<minlen;k++)
 //{
 //    printf("(%d,%d)",path[k].i,path[k].j);
 //    if((k+1)%5==0) printf("\n\t");
 //}
 printf("\n");
 }
 void main()
 {
     int k;
     printf("迷宫是有路径如下:\n");
     mgpath();
     printf("最长路径: \n");
     printf("步数:%d   走法:" ,max+1);
     for(k=0;k<=max;k++)
     {
         printf("(%d,%d) ",num[k].i,num[k].j);
         if((k+1)%5==0)printf("\n\t");
     }
         printf("\n");
 }
2011-04-03 17:14
童国顺
Rank: 1
等 级:新手上路
帖 子:70
专家分:6
注 册:2010-4-18
得分:0 
谢谢你的思想 我自己做出来了 非常感谢
2011-04-03 17:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-335497-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.993276 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved