A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄林 中级黑马   /  2012-12-28 12:36  /  2064 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1,一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种?请用递归算法编程实现。[中国某著名通信企业H面试题]
2,2:八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。[英国某著名计算机图形图像公司面试题]
有多少人看过,写过

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

4 个回复

倒序浏览
第一题,想半天,也没啥思路
百度了个详细的
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define GOAL 90    //目标环数
  4. #define MAX_SRE 10    //每次射击的最大环数
  5. #define MAX_CNT 10    //总共射击次数

  6. int score[MAX_CNT];    //有效环数
  7. int num = 0;    //可能的射击组合数

  8. //筛选有效环数,返回可能的组合数,否则返回-1
  9. int ValidScore(int sre, int cnt, int balance)
  10. {
  11.     balance -= sre;    //这次射击以后还需要射击的总环数

  12.     if(balance<0 || balance>((MAX_CNT-cnt)*MAX_SRE))    //退出递归的条件
  13.     {
  14.         cnt--;    //当最后一环不符合要求时,能不影响后面的打印判断
  15.         return -1;    //不符合条件,结束递归
  16.     }
  17.     else
  18.     {
  19.         score[cnt-1] = sre;    //存储有效环数

  20.         while(cnt < 9)    //控制射击次数
  21.         {
  22.             cnt++;
  23.             score[cnt-1] = -1;    //设置一个循环推出条件

  24.             for(sre=MAX_SRE; sre>=0; sre--)    //从高分往下寻找合适的分数
  25.             {
  26.                 if(-1 == ValidScore(sre, cnt, balance))    //若此分不能满足要求,那么低于它的分更不能满足要求了
  27.                     break;
  28.             }

  29.             if(-1 == score[cnt-1])    //若通过上面的for循环,在第cnt次里没有满足要求的环数了,那第cnt次以后的次数就根本不用再继续寻找了
  30.                 break;
  31.         }

  32.         if(9 == cnt && balance <= MAX_SRE)    //最后一次设计可以不用循环来控制,而是直接等于除了前九次以外还需要的环数
  33.         {
  34.             score[cnt] = balance;    //最后一次需要射击的环数

  35.             //打印每一种可能的结果(如果要测目标环数为90的话,建议把这小段注释了,因为总共有92386种可能性)
  36.             printf("有效得分:");
  37.             for(cnt=0; cnt<MAX_CNT; cnt++)
  38.                 printf(" %d", score[cnt]);
  39.             printf("\n");

  40.             num++;    //找到一种可能性,总数加一
  41.         }
  42.     }

  43.     return num;
  44. }

  45. int main()
  46. {
  47.     int cnt = 1;    //射击次数

  48.     for(score[0]=MAX_SRE; score[0]>=0; (score[0])--)
  49.         ValidScore(score[0], cnt, GOAL);    //递归筛选有效环数

  50.     printf("总共有 %d 种可能。\n", num);

  51.     return 0;
  52. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
//其实第一个问题属于背包问题。答案是92378
  1. using System;
  2. class Program
  3. {
  4.     static int count = 0;
  5.     static void Main(string[] args)
  6.     {
  7.         shoot(10, 90);//开10枪打90环
  8.         Console.WriteLine(count);
  9.     }
  10.     static void shoot(int num, int score)
  11.     {
  12.         if (score < 0 || score > num * 10)
  13.             return;
  14.         else if (num == 0)
  15.             count++;
  16.         else
  17.             for (int i = 0; i <= 10; i++)
  18.             {
  19.                 shoot(num - 1, score - i);
  20.             }
  21.     }
  22. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
觉得讲递归算法不错
http://www.cnblogs.com/serviceboy/archive/2009/07/19/1526590.html
回复 使用道具 举报
算法写得很好!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马