找了个博弈专题做了下,太坑爹了。。。。
简单的题还好,只要弄明白基本原理基本上都会做了。
有些题根本闻所未闻啊,什么FIB博弈,发现斐玻那契数列真的好常见。
这种题,要临到现场只能通过画P-N图找规律来做了。
专题链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=77145#overview
A题:
简单巴什博弈
#include<stdio.h>
int main(){
int t,n,m;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
if(n%(m+1)==0) printf("Rabbit\n");
else printf("Grass\n");
}
}
B题:
nim,求N-position向P-position转化的方式
#include<stdio.h>
int a[200005];
int main(){
int n,s;
while(scanf("%d",&n),n){
s=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
s^=a[i];
}
if(s==0) printf("No\n");
else{
printf("Yes\n");
for(int i=0;i<n;i++){
if(a[i]>(s^a[i])) printf("%d %d\n",a[i],s^a[i]);
}
}
}
}
C题:
巴什博弈
稍微变了下初始条件
也是求取法
#include<stdio.h>
int main(){
int n,m;
while(scanf("%d%d",&m,&n)!=EOF){
if(m%(n+1)==0) printf("none\n");
else{
if(m<=n) {
for(int i=m;i<=n;i++) printf("%d%c",i,i==n?'\n':' ');
}
else{
printf("%d\n",m%(n+1));
}
}
}
}
D题:
巴什
#include<stdio.h>
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n,m,t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
if(n%(m+1)==0) printf("second\n");
else printf("first\n");
}
}
E题:
Nim的另一种问法,考虑全为1的特殊情况
/*
对于一个奇异局势,后手者总是从剩下的最大值开始拿起,而这个最大值不为1,如果为1的话那么剩下的数也肯定是奇数个1,如为偶数个1可以使之变为奇数个1
*/
#include<stdio.h>
int main(){
int t,n,tmp;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int sum=0,s=0;
for(int i=0;i<n;i++) {
scanf("%d",&tmp);
s^=tmp;
if(tmp==1) sum++;
}
if(sum==n){
if(n%2==0) printf("John\n");
else printf("Brother\n");
}
else{
if(s==0) printf("Brother\n");
else printf("John\n");
}
}
}
F题:
SG函数,或者画P-N图递推,找规律
#include<stdio.h>
/*
sg函数,其实就是用P-N图进行递推
*/
#include<string.h>
int sg[1005],vis[1005],b[12];
void init(){
b[0]=1;
for(int i=1;i<12;i++) b[i]=b[i-1]*2;
sg[0]=0;
for(int i=1;i<=1000;i++){
memset(vis,0,sizeof(vis));
for(int j=0;b[j]<=i;j++){
vis[sg[i-b[j]]]++;
}
int k=0;
while(vis[k]) k++;
sg[i]=k;
}
}
int main(){
init();
int n;
while(scanf("%d",&n)!=EOF){
if(sg[n]==0) printf("Cici\n");
else printf("Kiki\n");
}
}
G题:
FIB博弈。。。。。
#include<stdio.h>
int fib[55];
int main(){
int n;
fib[0]=1;
fib[1]=2;
for(int i=2;i<45;i++) {
fib[i]=fib[i-1]+fib[i-2];
//printf("%d\n",fib[i]);
}
while(scanf("%d",&n),n){
int flag=1;
for(int i=1;i<50;i++) {
if(n==fib[i]) {
printf("Second win\n");
flag=0;
break;
}
}
if(flag) printf("First win\n");
}
}
H题:
巴什博弈变形
#include<stdio.h>
int main(){
int n,p,q;
while(scanf("%d%d%d",&n,&p,&q)!=EOF){
if(n%(p+q)==0){
printf("WIN\n");
}
else{
if(n%(p+q)<=p){
printf("LOST\n");
}
else{
printf("WIN\n");
}
}
}
}