BNUZ [kuangbin带你飞] 博弈基础

A - Calendar Game

题意:Adam 和 Eve 玩游戏。给出一个初始日期(1900年1月1日到2001年11月4日),可以选择两种操作。1.移动到该日期的下一天,2.移动到下个月的同一天。Adam 先手。谁移动到2001年11月4日则获胜,问 Adam 是否必胜。

分析:最后胜利的是奇数局势,即我们需要保证对面走偶数局势,即为我们必须一直占据奇数局势
注意点即为每个月的30号这天,因为可以转移到1号和下个月的30号造成不同的奇偶局势
而我们只需要考虑9月30日和11月30日,因为这两天是奇数开局并且为必败态

题解:

#include <iostream>
using namespace std;

int main(){
	int t;
	cin >> t;
	while(t --){
		int y, m, d;
		cin >> y >> m >> d;
		if((m+d)%2==0 || (d==30 && (m==9 || m==11))) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	return 0;
}

B - Euclid’s Game

题意:两个玩家 Stan 和 Ollie

#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
ll cnt;
void fun(ll x,ll y){
	cnt++;
	if(x!=y && x<2*y) fun(y,x-y);
}
int main(){
	ll n,m;
	while(scanf("%lld%lld",&n,&m) && (n&&m)){
		cnt=0;
		if(n<m) swap(n,m);
		fun(n,m);
		if(cnt%2!=0) puts("Stan wins");
		else puts("Ollie wins");
	}
	return 0;
}

C - Play a game

#include <cstdio>
using namespace std;
int main(){
	int n;
	while(~scanf("%d",&n) && n){
		if(n%2==0) puts("8600");
		else puts("ailyanlu");
	}
	return 0;
}

D - Brave Game

#include <cstdio>
using namespace std;
int main(){
	int t;
	scanf("%d",&t);
	while(t --){
		int n, m;
		scanf("%d%d",&n,&m);
		if(n%(m+1)!=0) puts("first");
		else puts("second");
	}
	return 0;
}

E - Good Luck in CET-4 Everybody!

巴什博弈

#include <cstdio>
using namespace std;
int main(){
	int n;
	while(~scanf("%d",&n)){
		if(n%3) puts("Kiki");
		else puts("Cici");
	}
	return 0;
}

F - 取石子游戏

斐波那契博弈

#include <cstdio>
#define ll long long
ll a[15010];
void fib(int n){
	int n1=1, n2=1, ret=1;
	for(int i=3; i<=n; i++){
		ret=n1+n2;
		n1=n2;
		n2=ret;
		a[i]=ret;
	}
}
int main(){
	a[1]=1;a[2]=1;
	fib(15000);
	int n;
	while(~scanf("%d", &n) && n){
		int flag=1;
		for(int i=1; i<=15000; i++){
			if(a[i]==n){
				flag=0;
				break;
			}
		}
		if(flag) puts("First win");
		else puts("Second win");
	}
	return 0;
}

G - 邂逅明下

#include <cstdio>
int main(){
	int n, p, q;
	while(~scanf("%d%d%d",&n,&p,&q)){
		int temp = n%(p+q);
		if(temp!=0 && temp<=p) puts("LOST");
		else puts("WIN");
	}
	return 0;
}

H - Nim or not Nim?

SG打表找规律

#include <cstdio>
#include <cstring>
int sg[1010],vis[1010];
int fun(int x){
	if(sg[x]!=-1) return sg[x];
	memset(vis,0,sizeof(vis));
	for(int i=x; i>0; i--) vis[fun(x-i)]=1;
	for(int i=1; i<=x/2; i++){
		int t = fun(i)^fun(x-i);
		vis[t]=1;
	}
	for(int i=0; ; i++) if(vis[i]==0) return sg[x]=i;
}
int main(){
	memset(sg,-1,sizeof(sg));
	sg[0]=0;
	sg[1]=1;
	for(int i=1; i<=30; i++)
		printf("%d %d\n",i,fun(i));
	return 0;
}
#include <cstdio>
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,ans = 0;
		scanf("%d",&n);
		for(int i=0; i<n; i++){
			int m;
			scanf("%d",&m);
			if(m%4==0) ans^=(m-1);
			else if(m%4==3) ans^=(m+1);
			else ans^=m;
		}
		if(ans) puts("Alice");
		else puts("Bob");
	}
	return 0;
}

I - Game

阶梯博弈

#include <cstdio>
int main(){
	int t,o=1;
	scanf("%d",&t);
	while(t--){
		int n,ans=0;
		scanf("%d",&n);
		for(int i=1; i<=n; i++){
			int x;
			scanf("%d",&x);
			if(i%6==2 || i%6==5 || i%6==0)
				ans^=x;
		}
		if(ans) printf("Case %d: Alice\n",o++);
		else printf("Case %d: Bob\n",o++);
	}
	return 0;
}

J - Daizhenyang’s Coin

sg

#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e4+10;
int sg[maxn],vis[maxn];
int main(){
	int i,j,k;
	sg[0]=1;
	for(i=1; i<=1000; i++){
		memset(vis,0,sizeof(vis));
		vis[0]=1;
		for(j=0; j<i; j++)
			vis[sg[j]]=1;
		for(j=0; j<i; j++)
			for(k=0; k<j; k++)
				vis[sg[j]^sg[k]]=1;
		for(j=0; ; j++)
			if(!vis[j]) break;
		sg[i]=j;
	}
	for(i=1;i<=20;i++)
		printf("%d %d\n",i,sg[i]);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值