南昌大学航天杯第二届程序设计竞赛校赛网络同步赛B 取石子(博弈SG函数模板)
题目链接:取石子
链接:https://www.nowcoder.com/acm/contest/122/B
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
假设先手后手都会选择最好的方式来取石子,请您判断先后手的输赢情况。
输入描述:
多组输入 每组一行,一行包括两个正整数n1和n2(1<=n1<=100,1<=n2<=100),代表了两堆石子的数目
输出描述:
如果先手能赢,输出"win";否则就输出"lose"。
输入
复制
1 1 1 2
输出
复制
lose win
参考文章:点击打开链接
博弈论总结:点击打开链接
1、定义:
(1)只有两人参与。
(2)游戏局面的状态集合是有限。
(3)对于同一个局面,两个游戏者的可操作集合完全相同
(4)游戏者轮流进行游戏。
(5)当无法进行操作时游戏结束,此时不能进行操作的一方算输。
(6)无论游戏如何进行,总可以在有限步数之内结束。
1.可选步数为1~m的连续整数,直接取模即可,SG(x) = x % (m+1);
2.可选步数为任意步,SG(x) = x;
3.可选步数为一系列不连续的数,用GetSG()计算
模板1如下(SG打表):
- //f[]:可以取走的石子个数
- //sg[]:0~n的SG函数值
- //hash[]:mex{}
- int f[N],sg[N],hash[N];
- void getSG(int n)
- {
- int i,j;
- memset(sg,0,sizeof(sg));
- for(i=1;i<=n;i++)
- {
- memset(hash,0,sizeof(hash));
- for(j=1;f[j]<=i;j++)
- hash[sg[i-f[j]]]=1;
- for(j=0;j<=n;j++) //求mes{}中未出现的最小的非负整数
- {
- if(hash[j]==0)
- {
- sg[i]=j;
- break;
- }
- }
- }
- }
模板2如下(dfs):
- int f[105],sg[1005];//f[]为所要拿取的球数
- int sg_dfs(int x)
- {
- if(sg[x]!=-1)
- return sg[x];
- bool visited[1005];//必须在函数里面定义,在全局定义会出错
- memset(visited,0,sizeof(visited));
- for(int i=1;i<=30;i++)//i<=f[]的项数
- {
- if(x>=f[i])
- visited[sg_dfs(x-f[i])]=1;
- }
- for(int i=0;;i++)
- if(!visited[i])
- {
- sg[x]=i;
- break;
- }
- return sg[x];
- }
- int main()
- {
- memset(sg,-1,sizeof(sg));//sg[]初始化为-1
- sort(f,f+n);//将f[]排列
- if(sg_dfs(m)^sg_dfs(n)^sg_dfs(p))
- cout<<1<<endl;
- else
- cout<<0<<endl;
- return 0;
- }
AC代码:
#include<stdio.h>
#include<string.h>int f[5],sg[1010];//f[]为所要拿取的球数 int sg_dfs(int x)
{if(sg[x]!=-1) return sg[x];int book[1010];//必须在函数里定义,全局定义会出错 memset(book,0,sizeof(book));for(int i=1;i<=3;i++)//i<=f[]的项数 {if(x>=f[i]) book[sg_dfs(x-f[i])]=1;}for(int i=0;;i++){if(book[i]==0){sg[x]=i;break;}}return sg[x];
}int main()
{memset(sg,-1,sizeof(sg));//sg[]初始化为-1 f[1]=1;f[2]=3;f[3]=9;int n,m;while(~scanf("%d%d",&n,&m)){if(sg_dfs(n)^sg_dfs(m)==0) printf("lose\n");else printf("win\n");}return 0;
}
南昌大学航天杯第二届程序设计竞赛校赛网络同步赛B 取石子(博弈SG函数模板)相关推荐
- 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 部分题解
A-ID and password 签到题. #include <iostream> #include <cstdio> #include <bits/stdc++.h& ...
- 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛题解
A,C,I签到题,只搞了8题,还一题是神仙做的,我不会 链接:https://www.nowcoder.com/acm/contest/122/B 来源:牛客网 取石子 时间限制:C/C++ 1秒,其 ...
- 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 - 题解
A - ID and password 题目描述 Users prefer simple passwords that are easy to remember, but such passwords ...
- 第十五届北京师范大学程序设计竞赛决赛(网络同步赛) B lca水 D 思维,找规律...
第十五届北京师范大学程序设计竞赛决赛(网络同步赛) B. Borrow Classroom 题意:一棵树,点 1为根,一个人从点 b到 点 c再到点 1,第二个人从点 a出发,问第二个人能否截住第一个 ...
- 南昌大学航天杯第二届部分题解
这个比赛的题目考的比较多的都是大数运算,或者unsigned long long 的数据范围(1e18以内). 首先是a题,签到,只不过是加了英文的描述,大意就是多组数据输入,然后将每组的字符串大写转 ...
- 浙江农林大学蓝桥杯程序设计竞赛校选拔赛(同步赛)签到题ABFGHIJ
A. uu与糖果 链接:https://ac.nowcoder.com/acm/contest/12479/A 来源:牛客网 题目描述 uu是一个伟大的魔法师,她有n堆糖果. 由于她想得到更多的糖果, ...
- 浙江农林大学第二十一届程序设计竞赛校选拔赛(同步)
瓜瓜的A+B #include <iostream> using namespace std;typedef long long ll;ll qmi(ll a, ll b, ll p) { ...
- 江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)
链接:https://ac.nowcoder.com/acm/contest/635/H 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 浙江农林大学第二十一届程序设计竞赛校选拔赛A E G H
A 瓜瓜的春天 传送门 题意:电梯前有两列队伍,电梯一次可以坐两人,其中 有 25% 的可能,电梯是满的,没有办法乘坐电梯: 有 25% 的可能,电梯是空的,则两队队首都可以乘坐电梯: 有 50% 的 ...
最新文章
- 辽宁省计算机专业A类,辽宁省2008年中职升高职招生考试计算机专业综合试题
- Connectify错误“Internet Connection Sharing is currently unavailable.”解决方法不要有多重的网桥连接
- JAVA——HttpClient封装工具类
- 650c公路车推荐_2020最具性价比的中高端公路整车盘点
- c# maiform父窗体改变动态的gridew 奇偶行变色的快捷方法
- shiro将session认证改成token认证_初步学习Shiro框架 第一集
- python库--Numpy and pandas
- 对WebBrowser控件设置代理
- FFmpeg之编译ffplay(十四)
- docker镜像的常用操作
- c语言翻转棋ai算法,有没有人懂黑白棋(翻转棋)的核心算法
- 【科研作图】软件推荐资源汇总PPT瑞思拜!
- 常见分布 的 数学期望以及方差公式
- 贝塞尔曲线及实践案例
- 使对话框的最大化、最小化和关闭按钮变灰以及对其重载的方法
- 大数据:大二上期期末感悟及总结
- javascript数组(array)的常用方法(shift/unshift/pop/push/concat/splice/reverse/sort/slice/join)
- Pro ASP.NET Core MVC(四)【C#关键特征】
- VRAR景点虚拟漫游感受超震撼、高逼真的创新旅游体验
- WIN7下使用iis搭建php环境(上)