简单博弈(hdu 2188 && 4764 && 2149 && 3863 && 3951 && 1564)

来源:互联网 发布:植物名称查询软件 编辑:程序博客网 时间:2024/06/06 04:33

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");}elseprintf("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");//先手赢elseprintf("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);}elseprintf(" %d", i);}}}printf("\n");}return 0;}

3863题目:点击打开链接

这题……………………特别不想吐槽………………题目意思就是先手从左到右连接蓝点,后手从上到下连接红点,轮流进行,谁先对面谁赢。想了半天想不太出来,结果居然是是先手一定会胜,因为先手后手完成一样的任务,先手比后手先走一步,必定是赢的。

#include <stdio.h>int main (void){int n;while(scanf("%d", &n) != EOF){if(n == -1)break;elseprintf("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");elseprintf("first\n");}elseprintf("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");elseprintf("ailyanlu\n");}return 0;}


总结一下,博弈太差。

0 0
原创粉丝点击