2188题目:点击打开链接
赤裸裸的巴什博弈。
#include <stdio.h>
int main (void)
{
int c;
scanf("%d", &c);
while(c --)
{
int n, m;
scanf("%d %d", &n, &m);
if(n % (m + 1) == 0)
{
printf("Rabbit\n");
}
else
printf("Grass\n");
}
return 0;
}
4764题目:点击打开链接
两个人轮流写数字,谁先超过给定的数n谁输。
题目说1 <= Y - X <= k,也就是 1 + X <= Y <= k + X,因为是累加,所以可以看成X和Y的范围是 1<= Y, X <= k,所以这样就转化为谁取到最后谁输的巴什博弈。仔细考虑一下,巴什博弈是每次累加着取,而这题是在对方写的数字的基础上取,其实两种情况是一样的。
胜的一方必须是拿到N-1这个数 那么输的一方肯定是在 N-k-1 ~ N-2 这些数中取 那么赢的一方必然取到了N-k-2这个数
所以一次递归推算 先手取到这些特殊数的必赢 这些数为 N-1、N-1-(k+1)、N-1-2(k+1) ......
所以得如果N-1 能够整除 k+1 则后手赢 否则先手赢
当然得注意N=1 的情况 和k>=N 的情况
#include <stdio.h>
int main (void)
{
int n, k;
while(scanf("%d %d", &n, &k) != EOF)
{
if(n == 0 && k == 0)
break;
if((n - 1) % (k + 1) != 0)
printf("Tang\n");//先手赢
else
printf("Jiang\n");
}
return 0;
}
2149题目:点击打开链接
这题就是巴什博弈的一个扩展。
#include <stdio.h>
int main (void)
{
int m, n;
while(scanf("%d %d", &m, &n) != EOF)
{
int i;
if(m % (n + 1) == 0)//先手必输
printf("none");
else
{
int f = 0;
if(n < m)//只要留给对方(n +1)的倍数个就能赢,所以将除以(n + 1)的余数个都拿走
printf("%d", m % (n + 1));
if(n >= m)
{
for(i = m; i <= n; i ++)
{
if(f == 0)
{
f = 1;
printf("%d", i);
}
else
printf(" %d", i);
}
}
}
printf("\n");
}
return 0;
}
3863题目: 点击打开链接
这题……………………特别不想吐槽………………题目意思就是先手从左到右连接蓝点,后手从上到下连接红点,轮流进行,谁先对面谁赢。想了半天想不太出来,结果居然是是先手一定会胜,因为先手后手完成一样的任务,先手比后手先走一步,必定是赢的。
#include <stdio.h>
int main (void)
{
int n;
while(scanf("%d", &n) != EOF)
{
if(n == -1)
break;
else
printf("I bet on Oregon Maple~\n");
}
return 0;
}
3951题目: 点击打开链接
环形博弈,把硬币围成一个圈,然后每次可以取一个或者连续的2到k个,这题挺像NYOJ上取石子(七)的,我刚开始没有写m >= k的情况所以WA了,如果每次最多只能去一个,那么就根据硬币个数的奇偶性来判断,如果给的k大于1,那么后手一定胜,因为后手可以根据先手所取的,将剩下的硬币平分,就一颗保证一定赢。
#include <stdio.h>
int main (void)
{
int t, c = 0;
scanf("%d", &t);
while(t --)
{
c ++;
int n, m;
scanf("%d %d", &n, &m);
printf("Case %d: ", c);
if(m >= n)
{//这里别忘
printf("first\n");
}
else if(m == 1)
{
if(n % 2 == 0)
printf("second\n");
else
printf("first\n");
}
else
printf("second\n");
}
return 0;
}
1564题目:点击打开链接
直接判断奇偶性,我做的时候就抱着试一试的心态交的代码……没想到就过了……
#include <stdio.h>
int main (void)
{
int n;
while(scanf("%d", &n) != EOF)
{
if(n == 0)
break;
if(n % 2 == 0)
printf("8600\n");
else
printf("ailyanlu\n");
}
return 0;
}
总结一下,博弈太差。