| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 862 人关注过本帖
标题:一道关于杀狼的算法题
只看楼主 加入收藏
vdestroyer
Rank: 2
等 级:论坛游民
帖 子:136
专家分:14
注 册:2009-1-7
结帖率:96.43%
收藏
已结贴  问题点数:20 回复次数:6 
一道关于杀狼的算法题
在一个森林里,有一群狼。因为这群狼的数量过多,现在决定大规模杀狼。
目标是,把这群狼杀到刚好剩42只为止。
但是,杀的方法有些讲究。

如果说,这群狼一共有 n 只,那么:
·如果n是偶数,那么可以杀掉一半的狼
·如果n可以被3并且/或者4整除,那可以把n的最后两位数字 的乘积的这个数字设为 a,杀掉a只狼(这里可能没说清楚,没关系,后面有例子)
·如果n可以被5整除,那么可以杀掉42只狼。

一个例子:
开始有250只狼
·250可以被5整除,所以我们可以用250 - 42 还剩下208只狼
·208是偶数,所以可以杀掉一半,还剩104只狼
·104是偶数,所以可以再一次杀掉一半,还剩52只狼
·52可以被4整除,用52的最后两位数字,5和2,相乘。 得出,5 * 2 = 10,用52 - 10 刚好等于42
通过这种方式,就能刚好让这群狼剩下42只


写一个程序,输入一群狼最开始的数量,让程序回答,是否能杀到刚好剩42只。
(换句话说,有些输入数据,是肯定不能杀到剩42只的)

为了方便测试,给两个例子:
多少只狼? 7762
不能达到目标

多少只狼? 7461
可以达到目标

一些个人的浅见:
应该是用回溯算法比较方便吧。。。本人水平太差,还用不好这种算法,大家看看吧。
当然,这题并没有要求具体用哪种算法。


[ 本帖最后由 vdestroyer 于 2009-11-7 02:34 编辑 ]
搜索更多相关主题的帖子: 算法 
2009-11-07 02:33
rib
Rank: 4
等 级:业余侠客
帖 子:95
专家分:252
注 册:2009-3-30
收藏
得分:0 
如果N既是偶数又可以被5整除,或者可以被3并且/或者4整除
那该怎么算法


程序代码:
#include<stdio.h>
void main()
{
 int n;
 printf("shu ru lang de shu liang");
 scanf("%d",&n);

 while(n > 42)
 {
  if (n % 2 == 0)
  {
   n = n / 2;
  }

  if ((n % 3 == 0) || (n % 4 == 0))
  {
   n = (n - n%10) * (n/10 - n/10%10);   
  }

  if (n % 5 == 0)
  {
   n = n - 42;   
  }

  if(n == 42)
  {
   break;
  }
 }

 if (n == 42)
 {
  printf("ke yi da dao mu biao");
 }
 else
 {
  printf("bu neng da dao mu biao");
 }
}

请教下     我这个程序达不到效果  请问下怎么去改

用基础的for if while等循环能做这题吗
2009-11-07 09:36
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
回复 2楼 rib
因为它是要剩下42条狼,所以不是说可以乱杀的,杀到后面不能剩下42条的时候,需要回溯,从有重复的地方走另外一条路看能不能得到42的结果,全部试完都不行的话才能说无法杀到这那个结果,··偶初学者··有时间试试··
2009-11-07 09:49
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:20 
如楼上所说递归回溯。
程序代码:
#include <stdio.h>

int sha(int n)                      /* 递归杀狼                       */
{
 if(n<42) return 0;
 else if(n==42) return 1;

 if(n%5==0) if(sha(n-42)) return 1;

 if(n%2==0) if(sha(n/2)) return 1;

 if(n%3==0 || n%4==0)
   if(n%10*(n%100/10)!=0)
     if(sha(n-(n%10)*(n%100/10))) return 1;

 return 0;
}

int main(void)
{
 int n;

 printf("n=");
 scanf("%d",&n);                  /* 输入狼总数 */

 if(sha(n))
   printf("OK!\n");
 else
   printf("NO!\n");

 getch();
 return 0;
}


努力—前进—变老—退休—入土
2009-11-07 10:39
vdestroyer
Rank: 2
等 级:论坛游民
帖 子:136
专家分:14
注 册:2009-1-7
收藏
得分:0 
回复 4楼 UserYuH
楼上这种方法应该是对的,受教了,谢谢
2009-11-08 17:35
雪花神剑
Rank: 2
来 自:吉林
等 级:论坛游民
帖 子:579
专家分:47
注 册:2009-3-12
收藏
得分:0 
回复 4楼 UserYuH
。。






2009-11-08 23:28
雪花神剑
Rank: 2
来 自:吉林
等 级:论坛游民
帖 子:579
专家分:47
注 册:2009-3-12
收藏
得分:0 
不用递归行吗?
2009-11-09 11:59
快速回复:一道关于杀狼的算法题
数据加载中...
 
   



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

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