巴什博弈:

只有一堆n个物品,两个人轮流从这堆物品中取除,每次取的个数为[1,m](至少去一个,最多取m个),最后取完者获胜

特征:

物品只有一堆,简单变形:

要么在范围内不规定个数,要么规定只能取几个

分析:

1.如果n<=m,那么先者一定赢

2.如果n=m+1,那么由于一次最多取m个,无论先取者拿走多少个,后者一定能够一次拿走所有物品,后者取胜

3.因此,我们发现了如何取胜的方法:
如果n=(m+1)*r+s;(r为任意自然数,s<=m),那么先取者拿走s个物品,后取者拿走k(k<=m)个物品,先取者再拿走(m+1-k)个物品,结果剩下(m+1)*(r-1)个物品,那么先取者一定获胜

4.要保持给对手留下(m+1)的倍数个物品,只要n%(m+1)!=0,先取者一定获胜

例题:

NYOJ23取石子(一)

//hdu2149 巴什博弈
#include<bits/stdc++.h>
using namespace std;int main()
{ios::sync_with_stdio(false);int n,m,t;cin>>t;while(t--){cin>>n>>m;if(n%(m+1)!=0)printf("Win\n");elseprintf("Lose\n");}return 0;} 

HDU2149    Public Sale

//hdu2149 巴什博弈
#include<bits/stdc++.h>
using namespace std;int main()
{ios::sync_with_stdio(false);int n,m;while(cin>>n>>m){if(n<=m){for(int i=n;i<m;i++)printf("%d ",i);printf("%d\n",m);}else{if(n%(m+1)==0)printf("none\n");else{bool first=1;//控制输出格式 for(int s=1;s<=m;s++){if((n-s)%(m+1)==0){if(first){//如果是第一个元素 printf("%d",s);first=0;//已输出第一个元素 }  elseprintf(" %d");//非第一个元素,前面右一个空格                     }}printf("\n");}}}return 0;} 

优化之后的代码:

1.若n>m,先取者必胜
2.若n%(m+1)!=0,那么第一个取的数就是n%(m+1);

留给对手的就是m+1的倍数 

#include<iostream>
using namespace std;
int main()
{   int n;//成本 int m;//最大加价 while(scanf("%d%d",&n,&m)!=EOF){  if(n%(m+1)==0) cout<<"none";else{   if(n%(m+1))  cout<<n%(m+1); //直接取余数 if(m>=n){   for(int i=n+1;i<=m;i++)cout<<" "<<i;} }cout<<endl;}return 0;
}

Java

import java.util.*;
import java.math.*;public class Main{static int MAXN=(int)(2e5+10);public static void main(String[] args) {Scanner cin=new Scanner(System.in);while(cin.hasNext()) {int m=cin.nextInt();int n=cin.nextInt();if(m<=n) {for(int i=m;i<=n;i++) {System.out.print(i);if(i==n)System.out.println();elseSystem.out.print(" ");}continue;}if(m%(n+1)==0)System.out.println("none");else {int x=m%(n+1);System.out.println(x);}}cin.close();}
}

HDU1847 巴什博弈
寻找必败状态,若n%3=0,则cici赢,否则kiki赢
枚举前面几个数,找规律

分析:

1.若留给cici的是3,那么cici只能取1个或者2个
所以下一次Kiki取后必赢
2.若是给Cici留下的是3的倍数,假设为3n(n=1,2,3,..),
那么无论Cici取什么数,剩余的数一定可以写成3m+1或者3m+2(m<n)的形式,
那么只要Kiki再取的时候留给Cici的仍然是3的倍数的话,就必胜了

#include<bits/stdc++.h>
using namespace std;int main()
{ios::sync_with_stdio(false);int n;while(cin>>n){if(n%3==0)cout<<"Cici\n";else cout<<"Kiki\n";} return 0;}  

HDU2188

import java.util.*;
import java.math.*;public class Main{static int MAXN=(int)(2e5+10);public static void main(String[] args) {Scanner cin=new Scanner(System.in);int T=cin.nextInt();while((T--)!=0) {int n=cin.nextInt();int m=cin.nextInt();if(n<=m) {System.out.println("Grass");continue;}if(n%(m+1)==0) {System.out.println("Rabbit");}else {System.out.println("Grass");}}cin.close();}
}

HDU 2897 巴什博弈变形

每行有三个数字n,p,q,表示一堆硬币一共有n枚,从这个硬币堆里取硬币,一次最少取p枚,最多q枚,如果剩下少于p枚就要一次取完。两人轮流取,直到堆里的硬币取完,最后一次取硬币的算输。对于每一行的三个数字,给出先取的人是否有必胜策略,如果有回答WIN,否则回答LOST。

Input

不超过100000行,每行三个正整数n,p,q。

Output

对应每行输入,按前面介绍的游戏规则,判断先取者是否有必胜策略。输出WIN或者LOST。

Sample Input

7 2 4

6 2 4

Sample Output

LOST

WIN

分析:

假设先取者为A,后取者为B,初始状态下有石子n个,除最后一次外,其他每次取得石子个数必须在[p,q]之间。

1):若当前石子共有n = (p+q) * r个,则A必胜;

必胜策略为:A第一次取q个,以后每次若B取K个,A取(p+q-k)个,如此下去;最后必剩下p个给B,所以A必胜。

2)若n = (p+q)* r + left个(1 <= left <= p)B必胜;

必胜策略为:每次取石子活动中,若A取k个,则B去(p+q-k)个,那么最后剩下left个给A,此时left <= p,所以A只能一次去完,B胜。

3)若n = (p+q) * r + left个(p < left <= q),则A必胜;

必胜策略为:A第一次取t(1 <= left – t < = p)个,以后每次B取k个,则A取(p+q-k)个,那么最后留下1 <= left – t <= p给B,则A胜。

(也就相当于当A取得时候,他可以把当前局势变为第2种的,即让B面对必败态,这时候的原理和第2种就一样了)

import java.util.*;
import java.math.*;public class Main{static int MAXN=(int)(2e5+10);public static void main(String[] args) {Scanner cin=new Scanner(System.in);while(cin.hasNext()) {int n=cin.nextInt();int p=cin.nextInt();int q=cin.nextInt();int left=n%(p+q);if(left==0)System.out.println("WIN");else if(left<=p)System.out.println("LOST");else System.out.println("WIN");}cin.close();}
}

打表代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
using namespace std;
const int maxn=2e5+10;
int sg[maxn];
int vis[maxn];
void SG(int n,int p,int q)
{int i,j;memset(sg,0,sizeof(sg));for(i=p+1; i<=n; ++i){memset(vis,0,sizeof(vis));for(j=p; j<=q; ++j)vis[sg[i-j]]=1;//标记最小的不属于这个集合的非负整数for(j=0; j<n; ++j)if(!vis[j]){sg[i]=j;break;}}for(i=0; i<n; i++)cout<<sg[i]<<endl;
}
int main(){int n,p,q;while(scanf("%d%d%d",&n,&p,&q)!=EOF){SG(n,p,q);}
}

巴什博弈例题:NYOJ23;HDU:2149,1847,2897,2188相关推荐

  1. hdu 2149 巴什博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=2149 分析:就是巴什博弈的概念. 题目要求:对于每组数据,在一行里按递增的顺序输出Lele第一次可以加的价.两个 ...

  2. HDU 1847 Good Luck in CET-4 Everybody! (巴什博弈)

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  3. hdu 1846 Brave Game 勇敢者的游戏 DP/巴什博弈

    动态规划/简单博弈 Brave Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. hdu 2188巴什博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=2188 分析:巴什博弈. View Code // I'm lanjiangzhou //C #include & ...

  5. 题解报告:hdu 2188 悼念512汶川大地震遇难同胞——选拔志愿者(巴什博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2188 Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每 ...

  6. 题解报告:hdu 1846 Brave Game(巴什博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1846 Problem Description 十年前读大学的时候,中国每年都要从国外引进一些电影大片, ...

  7. 【HDU - 2149】Public Sale (巴什博奕)

    题干: 虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金.现在等待他的,就是像FarmJohn一样的农田生涯. 要种田得有田才行,Lele听说街上正在举行一场别开生面 ...

  8. HDU 1517 A Multiplication Game 巴什博弈

    题意:2 个人玩游戏,给定一个数n,从 1 开始,轮流对数进行累乘一个数(2~9中取), 直到第一次等于或超过n为赢. 思路:1)找规律 如果n是 2 ~ 9 ,Stan 必胜. 如果输入是 10~1 ...

  9. HDU 2188 经典巴什博弈

    1.问题模型:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取光者得胜. 经典巴什博弈,参考到博客别人:点击打开链接 #include<iostream> ...

最新文章

  1. PCL点云配准(3)
  2. Tomcat中文乱码问题的原理和解决方法
  3. (HDU)1091 --A+B for Input-Output Practice (III)(输入输出练习(III))
  4. [PHP]用PHPUnit进行行为驱动开发(Behaviour-Driven Development)
  5. 普及一下equals和==的区别的误区
  6. 音视频技术开发周刊 | 171
  7. 安装 CocoaPods Alcatraz
  8. 单机最大负载_电流互感器允许接入的实际最大二次负载(注电案例1865)
  9. apm飞控制作_传统直接转矩控制
  10. 设计师如何了解行业方向?推荐设计师交流平台
  11. HTML标记特定,制作asp:标记特定的HTML标记
  12. 网格交易法——震荡行情的必杀技交易策略
  13. welearn视听说 读写 答题助手 综合插件
  14. MySQL查询效率问题
  15. 定向士官计算机网络技术在部队干什么,定向培养士官是干什么的
  16. OpenCV:图像平移
  17. oracle增加dbf文件,oracle导入dbf文件工具下载|
  18. CRM 客户管理系统(SpringBoot+MyBatis)
  19. 开启xmp1还是2_在DLSS2.0技术的加持下,游戏开启光线追踪的硬件需求是否会大大降低?...
  20. MySQL日期类型及默认设置

热门文章

  1. ATL的GUI程序设计(前言)
  2. android 连接 asp.net webservice 简单记录
  3. MSSSQL 脚本收藏
  4. Net 4.0 Parallel 编程(六)Task(下)
  5. Opera 发布新技术 Opera Unite
  6. 让人生成功的49个细节
  7. 头的各个部位示意图_微观古建—古建筑的墀头(一)
  8. oracle dg状态查询,oracle dg状态检查及相关命令
  9. java 队列的数组_JAVA-循环数组实现简单的队列
  10. boot mybatis mysql_SpringBoot+Mybatis+MySql学习