| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 980 人关注过本帖
标题:一个问题的编程思路,路过的有什么好的解决思路呢
取消只看楼主 加入收藏
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
结帖率:91.67%
收藏
已结贴  问题点数:5 回复次数:8 
一个问题的编程思路,路过的有什么好的解决思路呢
我的想法是先在二维数组中分别找到起点和重点的坐标,find();然后起点为初始地,开始每个格子的四个方向分别寻找出路,用递归貌似不太会。
例如输入一个5*5的地图:
                           -----
                       -B##-
                       ###--
                       #---#
                       ---H#

图片附件: 游客没有浏览图片的权限,请 登录注册


程序代码:
#include <stdio.h> 
#include <stdlib.h>
char find(char*p,int B_pos1,int B_pos2,int H_pos1,int H_pos2 )
void main()
{
   int r,c;int i,j;int B_pos1,B_pos2,H_pos1,H_pos2=0;
   char *p;
   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;
         }
    }
   for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
        {
            if(*(p+c*i+j)=='H');
            H_pos1=i;
            H_pos2=j;
         }
    }
   find(p,B_pos1,B_pos2,H_pos1,H_pos2=j);
}
char find(char*p,int B_pos1,int B_pos2,int H_pos1,int H_pos2 )
{

}


有什么思路可以给下写这个find函数嘛?

[ 本帖最后由 longxingxiu 于 2014-5-10 13:59 编辑 ]
搜索更多相关主题的帖子: color 起点 格子 
2014-05-10 13:47
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
收藏
得分:0 
自己写了一段find函数,为什么输入##BH测试,没有返回呢?我返回函数写错了吗?求砖家帮忙看下


程序代码:
#include <stdio.h> 
#include <stdlib.h>
char find(char*p,int B_pos1,int B_pos2,int c,int r );
void main()
{
   int r,c;int i,j;int B_pos1,B_pos2,H_pos1,H_pos2=0;
   char *p;
   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;
         }
    }
   for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
        {
            if(*(p+c*i+j)=='H');
            H_pos1=i;
            H_pos2=j;
         }
    }
   find(p,B_pos1,B_pos2,c,r);
}
char find(char*p,int B1,int B2,int c,int r )
{
    if(*(p+c*B1+B2-1)=='H'||*(p+c*B1+B2+1)=='H'||*(p+c*(B1-1)+B2)=='H'||*(p+c*(B1+1)+B2)=='H')
    {
        return 'Y';
    }
    else if(*(p+c*B1+B2-1)=='-')//||*(p+c*B1+B2+1)=='-'||*(p+c*(B1-1)+B2)=='-'||*(p+c*(B1+1)+B2)=='-')
         {     B2=B2-1   ;find(p,B1,B2,c,r);}
          if(*(p+c*B1+B2+1)=='-')
          { B2=B2+1; find(p,B1,B2,c,r); }
          if(*(p+c*(B1-1)+B2)=='-')
          {B1=B1-1;find(p,B1,B2,c,r);}
          if(*(p+c*(B1+1)+B2)=='-')
          {B1=B1+1;find(p,B1,B2,c,r);}
          else return 'N';
          
}   
2014-05-12 00:35
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
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
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
收藏
得分:0 
回复 18 楼 top398
嗯嗯,
2014-05-15 17:45
快速回复:一个问题的编程思路,路过的有什么好的解决思路呢
数据加载中...
 
   



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

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