吴昊品游戏核心算法 Round 7(特刊)—— 猜数字系列AI第一弹(二分思想)(HDOJ 2178)
这 个AI比较地弱智,不过,作为吴昊品游戏核心算法Round 7特刊的一系列,我还是将其加上了,毕竟,这款游戏还是非常经典的!其也分单机版和在线版两款模式,恩,其AI主要是运用了二分的思想。所谓二分,可以上 溯到中国两千年前的时期,思想乃是不断取中,然后在最短的次数的前提下得到最准确的答案。
(单机版)
(网络版)
如图所示,这两个版本各有千秋吧。关于二分搜索为什么是平均搜索次数最短的,这个可以参考相关的数据结构书籍,这里就不提出来了。Source来自HDU 2178:
Problem Description——A有1数m,B来猜.B每猜一次,A就说"太大","太小"或"对了" 。 问B猜n次可以猜到的最大数。
Input——第1行是整数T,表示有T组数据,下面有T行 每行一个整数n (1 ≤ n ≤ 30)
Output
撇开问题的源代码不谈,二分作为一种思想,已经深入到许多问题的场合中,一些与数据处理有关的问题,本来是O(n^2)复杂度的问题,也许一个二分之后,就可以变为O(nlogn),下面,给出带注释的源代码:
吴昊注释:在最坏的情况下,在1到m间,你最多只要猜log2(m)+1(取整)次,所以易知==>m=2^n-1.即猜n次,你能猜到的最大的数 为2^n-1.我们也可认为,在数1到2^n-1间,我们都可以在n次内猜出来,如果大于这个数,n次内我们就哟可能猜不来了。例如1--7间,我们至少 要猜3次猜可以
1 int main()
2
3 {
4
5 int t, n, m;
6
7 scanf("%d", &t);
8
9 while (t--)
10
11 {
12
13 scanf("%d", &n);
14
15 m = 1;
16
17 while (n--) m <<= 1;
18
19 printf("%d\n", m-1);
20
21 }
22
23 return 0;
24
25 }
2
3 {
4
5 int t, n, m;
6
7 scanf("%d", &t);
8
9 while (t--)
10
11 {
12
13 scanf("%d", &n);
14
15 m = 1;
16
17 while (n--) m <<= 1;
18
19 printf("%d\n", m-1);
20
21 }
22
23 return 0;
24
25 }