package A类有价值的回顾的;
import java.util.Scanner;
public class 取球博弈 {
private static int[] a = new int[3];
private static int[] bb = new int[5];
private static int f(int b,int myc,int hisc){
//多分支是来源于 用a中的哪个来选择b中的哪个
boolean is0 = false;
if(b-a[0] < 0 && b-a[1] < 0 && b-a[2] < 0){//没有能够取到的意思是说,都小于0了
if(myc%2 == 1&& hisc%2 == 0) return 1;
if(myc%2 == 1&& hisc%2 == 1) return 0;
if(myc%2 == 0&& hisc%2 == 1) return -1;
if(myc%2 == 0&& hisc%2 == 0) return 0;
}
for(int i=0;i<a.length;i++){
if(b-a[i]>=0){//如果没有这里的限制,将会导致本身不能进行的选择进行了
int n = f(b-a[i],hisc,myc + a[i]);//如果不用n,而是用两次f(b-a[i],hisc,myc),重复
if(n == -1) return 1;
if(n == 0) is0 = true;//如果对面选择了一个最优化的平局,对你来说你当然并不会满足,就会再往后寻找看一下是否能赢
}
}
if(is0 == true){
is0 = false;
return 0;
}
//for循环完了,既没有能赢的,也没有能逼平的,只好输了
return -1;
}
public static void main(String[] args){
boolean is1 = false,is0 = false;//初始化为什么要初始化为TRUE,很奇怪啊你,就像那个没关水龙头的装修工,你TM这不是砸自己的招牌,sbbbbb
Scanner sc = new Scanner(System.in);//老子就是要写代码,我能我的快感,那种探索的过程,虽然有粗心这个拦路虎,但是我也不畏惧,每个人都有自己非常有优势的地方,而真正的成功者是能够弥补自己短处的人,因为这个世界上的一件事你的优势只占一部分
for(int i=0;i<a.length;i++){
a[i] = sc.nextInt();
}
for(int j=0;j<bb.length;j++){
bb[j] = sc.nextInt();
}
for(int k=0;k<bb.length;k++){
int b=bb[k],myc=0,hisc=0;
for(int i=0;i<a.length;i++){
if(b-a[i] >= 0){
int n = f(b-a[i],hisc,myc + a[i]);
if(n == -1) { is1=true; break; }
if(n == 0) { is0=true; continue;}
//对面return了-1,你就是胜利的
}
}
//自己的多次选择分别交给对手处理,根据对手的return,只要能赢就退出,如果平了再看看接下来的有没有能赢的,实在没有只好输了
//你选择了一个最优的,我当然也要选择一个最优的,没什么问题
if(is1 == true){//这里的优先级一定要搞清楚
is1 =false;
is0 =false;
System.out.print("+ ");
}
else if(is0 == true){
is0 =false;
System.out.print("0 ");
}else
System.out.print("- ");
}
}
}
/*
* 取球博弈
两个人玩取球的游戏。
一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目。
如果无法继续取球,则游戏结束。
此时,持有奇数个球的一方获胜。
如果两人都是奇数,则为平局。
假设双方都采用最聪明的取法,
第一个取球的人一定能赢吗?
试编程解决这个问题。
输入格式:
第一行3个正整数n1 n2 n3,空格分开,表示每次可取的数目 (0<n1,n2,n3<100)
第二行5个正整数x1 x2 ... x5,空格分开,表示5局的初始球数(0<xi<1000)
输出格式:
一行5个字符,空格分开。分别表示每局先取球的人能否获胜。
能获胜则输出+,
次之,如有办法逼平对手,输出0,
无论如何都会输,则输出-
例如,输入:
1 2 3
1 2 3 4 5
程序应该输出:
+ 0 + 0 -
再例如,输入:
1 4 5
10 11 12 13 15
程序应该输出:
0 - 0 + +
再例如,输入:
2 3 5
7 8 9 10 11
程序应该输出:
+ 0 0 0 0
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
*/
取球博弈.java
最新推荐文章于 2021-03-12 07:58:48 发布