| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 980 人关注过本帖
标题:一个问题的编程思路,路过的有什么好的解决思路呢
只看楼主 加入收藏
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
收藏
得分:0 
回复 9 楼 embed_xuel
人艰不拆,谢谢提醒啦,
2014-05-12 20:05
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
收藏
得分:0 
回复 10 楼 top398
top398,还有人相信我啊原来。。。。
2014-05-12 20:07
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
收藏
得分:0 
回复 2 楼 top398
回溯?不会哦,有没有实例可以提供一下呢
2014-05-13 09:44
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
收藏
得分:0 
回复 6 楼 rjsp
这个思路还不错,就是遍历的次数怎么解决呢?处于边界的话要考虑一些范围问题,这个我先自己写下,谢谢啦!
2014-05-13 09:50
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
收藏
得分:0 
回复 2 楼 top398
回溯的话要用到堆栈吧?
2014-05-13 09:54
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
如果只是要确定有无路径,rjsp 的反复填充法不错。如果还要找出具体路径,则比较复杂。回溯的方法有些类似N皇后问题。
2014-05-13 09:58
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
收藏
得分:0 
回复 16 楼 top398
哦,谢谢,我看看皇后问题去。填充方法我得到了结果。
程序代码:
#include <stdio.h> 
#include <stdlib.h>
void find(char*p,int B_pos1,int B_pos2,int c,int r,int *q);
void main()
{
   int r,c;int i,j;int B_pos1,B_pos2,H_pos1,H_pos2=0;
   char *p;int num=0;
   printf("请输入地图的行数和列数,空格隔开:\t");
   scanf("%d%d",&r,&c);getchar();  //----此getchar();  是为了消除前面scanf("%d%d",&r,&c);输入时留下的换行符!
   printf("请输入%d行%d列的地图:\n",r,c);

   p=(char *)malloc(sizeof(char)*r*c);    
   for(i=0;i<r;i++)//输入地图 
     {
       for(j=0;j<c;j++)
           {
               scanf("%c",(p+c*i+j));               
           }
      } 
   for(i=0;i<r;i++)//显示地图
    {
        for(j=0;j<c;j++)
        {
            printf("%c\t",*(p+c*i+j));
         }
         printf("\n");
    }   
   for(i=0;i<r;i++)//找到地图的起点
    {
        for(j=0;j<c;j++)
        {
            if(*(p+c*i+j)=='B');
            { B_pos1=i;
              B_pos2=j;
            }
         }
    }
   find(p,B_pos1,B_pos2,c,r,&num);//用了递归
   if(num=1)    //如果一只都没有Y输出即找到H的话就输出N找不着
        {printf("Y");}  
   else  printf("N");
}
///////********填充思想,递归***************************************************///////////////
void find(char*p,int B1,int B2,int c,int r,int *q)
{   //int num=0;num=*q用来记录是否有可以找到的路径,一旦找到一条路,*q=1,num=*q,main函数用过num的值打印“Y”
    if(B2!=0)       //下面是分四个方向进行分解,并对边界问题进行约束
      {
         if(*(p+c*B1+B2-1)=='H')
             {*q=1;}//等于1表示可以找到路径,在main函数中打印出来
         else{ 
               if(*(p+c*B1+B2-1)=='-')
                {*(p+c*B1+B2-1)='B';B2=B2-1;find(p,B1,B2,c,r,q );}//注意要减一再递归,以下同
              }            
        }
    if(B2!=r-1)
        {
           if(*(p+c*B1+B2+1)=='H')
             {*q=1;}
           else{ 
               if(*(p+c*B1+B2+1)=='-')
                {*(p+c*B1+B2+1)='B';B2=B2+1;find(p,B1,B2,c,r,q);}
                }    
        }
    if(B1!=0)
        {
           if(*(p+c*(B1-1)+B2)=='H')
             {*q=1;}
           else{ 
               if(*(p+c*(B1-1)+B2)=='-')
                {*(p+c*(B1-1)+B2)='B';B1=B1-1;find(p,B1,B2,c,r,q );}
                        }    
        }
     if(B1!=c-1)
        {
           if(*(p+c*(B1+1)+B2)=='H')
             {*q=1;}
           else{ 
               if(*(p+c*(B1+1)+B2)=='-')
                {*(p+c*(B1+1)+B2)='B';B1=B1+1;find(p,B1,B2,c,r,q );}
                        }    
        }

 }



2014-05-15 00:13
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
刚好整理了一个迷宫算法,代码可以借鉴。
程序代码:
// 4*4 迷宫 深度优先搜索求解
// 4*4数组中,1代表通路,0代表障碍,2代表一条可行路径
#include <stdio.h>

char maze[4][4] = { {1, 1, 1, 1}, {0, 1, 0, 1}, {0, 1, 0, 1}, {0, 1, 1, 1} };
typedef struct {
    char x, y;
} COORD;
COORD dir[4] = { {0, 1}, {0, -1}, {1, 0}, { -1, 0} };
COORD path[16];

void maze_print( void )
{
    int i, j;
    for ( i = 0; i < 4; i++ ) {
        for ( j = 0; j < 4; j++ )
            printf( "%2d", maze[i][j] );
        printf( "\n" );
    }
    printf( "--------\n" );
}

void maze_try( int k )
{
    int i;
    if ( path[k].x == 3 && path[k].y == 3 ) {
        maze_print();
        return;
    }
    for ( i = 0; i < 4; i++ ) {
        path[k + 1].x = path[k].x + dir[i].x;
        path[k + 1].y = path[k].y + dir[i].y;
        if (    path[k + 1].x >= 0 && path[k + 1].x < 4 &&
                path[k + 1].y >= 0 && path[k + 1].y < 4 &&
                maze[path[k + 1].x][path[k + 1].y] == 1 ) {
            maze[path[k + 1].x][path[k + 1].y] = 2;
            maze_try( k + 1 );
            maze[path[k + 1].x][path[k + 1].y] = 1;
        }
    }
}

int main( void )
{
    printf ( "Origin:\n" );
    maze_print();

    path[0].x = 0;
    path[0].y = 0;
    maze[0][0] = 2;
    maze_try( 1 );

    return 0;
}

2014-05-15 00:38
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
收藏
得分:0 
回复 18 楼 top398
嗯嗯,
2014-05-15 17:45
dongshimou
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:44
专家分:152
注 册:2014-1-8
收藏
得分:0 
只求通路 可以直接DFS。
2014-05-20 12:21
快速回复:一个问题的编程思路,路过的有什么好的解决思路呢
数据加载中...
 
   



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

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