题目:
今盒子里有 n个小球,A 、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,
也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。
我们约定:
每个人从盒子中取出的球的数目必须是: 1,3 ,7或者 8个。
轮到某一方取球时不能弃权!
A先取球,然后双方交替取球,直到取完。
被迫拿到最后一个球的一方为负方(输方)
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数, A是否能赢?
输入
先是一个整数 n(n<100),表示接下来有n个整数。然后是 n个整数,每个占一行(整数 <10000),表示初始球数。
输出
输出 n行,表示A 的输赢情况(输为 0,赢为1 )。
样例输入
4 1 2 10 18
样例输出
0 1 1 0
分析:因为题目的数据时10000,所以可以先计算出1-10000个球的输赢情况
首先那第一个球的时候A的情况是输了记为false
第二个球的时候第一个拿球的人是true
第三个球的时候第一个拿球的人是无论是拿1个球,或是3个球,都是false
第四个球第一个拿球的人无论是拿1个球,或是3个球,都是true
第五个球第一个拿的人拿一个球的之后,还剩四个,再轮到第二个人拿,就变成了拿第四个球的结果了
接下来的情况就如上了
所以代码描述
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
boolean bo[] = new boolean[10000];
//有一个的时候,A必输
bo[1] = false;
//两个
bo[2] = true;
bo[3] = false;
bo[4] = true;
bo[5] = false;
bo[6] = true;
bo[7] = false;
bo[8] = true;
int kena[] = {1,3,7,8};
for(int i=9;i<10000;i++) {
for(int j=0;j<4;j++) {
if(bo[i-kena[j]]==false) {
bo[i] = true;
break;
}
}
}
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int qiu[] = new int[n];
for(int i=0;i<n;i++) {
qiu[i] = sc.nextInt();
}
for(int i=0;i<n;i++) {
int qiushu = qiu[i];
if(bo[qiushu]) {
System.out.println(1);
}else {
System.out.println(0);
}
}
}
}