Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1404

刚开始想采取找规律的方法解题,可以没有发现规律。无奈,只好采用求PN点的方法。

我们假设数字最右边为第一位,且为最低位。那么可以知道当最高位为0时,那么先手的人必定能胜利,这个可以作为一个剪枝条件。

接下来就是两种操作了:1.降低其中任何一位

             2.把其中一个0及这位0后面所有的数字删去

我们只需通过这两个操作,寻找目标数字的后续数字状态的PN状态,即可求得目标数字的PN状态。其实我们只需判断后续状态中有没有P点就行了,如果有P点,那么目标数字的状态为N点。如果没有N点,那么目标数字的状态为P点。通过这方法,就可以求得题目要求数字的PN状态了。

#include <iostream>
#include <cstring>
#include <sstream>
#include <cstdio> using namespace std; const int MAXN = 1000000 + 5;
int sg[MAXN]; stringstream ss;
int length ; inline int Get_digit( int num, int i ) // 求出数字第i位数,最右边为第1位
{
switch (i){
case 1: return num%10;
case 2: return num%100/10;
case 3: return num%1000/100;
case 4: return num%10000/1000;
case 5: return num%100000/10000;
default : return num/100000;
};
} int Get_sg( int num ) // 求sg值
{
if( sg[num]!=-1 )
return sg[num];
int temp = 1;
int orignal = num;
int i;
for( i=0;i<length-1;i++ ) // 缩小第i位的值
{
num = orignal;
if( Get_digit( num, i+1 )==0 )
{ // 消去0即后面所有的数
if( Get_sg( num/( temp*10 ) )==0 ) // 发现必败点
{
sg[ orignal ] = 1; // 则此点为必胜点
return 1;
}
}
num = orignal;
while( Get_digit( num, i+1)!=0 )
{
num = num - temp;
if( Get_sg( num )==0 ) // 发现必败点
{
sg[ orignal ] = 1; // 则此点为必胜点
return 1;
}
}
temp = temp * 10;
} num = orignal;
while( Get_digit(num, length)>1 ) // 最高位单独处理
{ // 避免出现 类似于 123 -> 23 的情况
num = num - temp;
if( Get_sg( num )==0 ) // 发现必败点
{
sg[ orignal ] = 1; // 则此点为必胜点
return 1;
}
}
sg[orignal] = 0; // 没有发现必败点,则此点即为必败点
return 0;
} int main()
{
memset( sg, -1,sizeof(sg) ); // 初始化
char in[10];
int num, ans;
sg[0] = 1;
sg[1] = 0; // 初始化
while( scanf("%s", in)!=EOF )
{
if( in[0]=='0' ) // 最高为为0, 则一定胜利
{
printf( "Yes\n" );
continue;
}
ss.clear();
ss << in;
ss >> num; // char转int
length = strlen(in); // 求该数字的长度
ans = Get_sg( num );
if( ans )
{
printf( "Yes\n" );
}
else
{
printf( "No\n" );
}
}
return 0;
}

Hdu 1404 Digital Deletions的更多相关文章

  1. HDU 1404 Digital Deletions (暴力博弈)

    题意:给定一个数字串,最长是6,然后有两种操作. 第一种是,把该串中的一个数字换成一个比该数字小的数,比如 5 可以换成 0,1,2,3,4.   e.g. 12345 --> 12341 第二 ...

  2. hdoj 1404 Digital Deletions(博弈论)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1404 一看就是博弈论的题目,但并没有什么思路,看了题解,才明白 就是求六位数的SG函数,暴力一遍,打表 ...

  3. hdu 1404 找sg ***

    HDU 1404  Digital Deletions 一串由0~9组成的数字,可以进行两个操作:1.把其中一个数变为比它小的数:2.把其中一个数字0及其右边的所以数字删除. 两人轮流进行操作,最后把 ...

  4. Digital Deletions HDU - 1404

    Digital deletions is a two-player game. The rule of the game is as following. Begin by writing down ...

  5. hdu 1404/zoj 2725 Digital Deletions 博弈论

    暴力打表!! 代码如下: #include<iostream> #include<algorithm> #include<cstdio> #include<c ...

  6. HDU 1404 (博弈) Digital Deletions

    首先如果第一个数字是0的话,那么先手必胜. 对于一个已知的先手必败状态,凡是能转移到先手必败的状态一定是必胜状态. 比如1是必败状态,那么2~9可以转移到1,所以是必胜状态. 10,10*,10**, ...

  7. HDU 1013 Digital Roots【字符串,水】

    Digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. HDU 1013 Digital Roots(to_string的具体运用)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1013 Digital Roots Time Limit: 2000/1000 MS (Java/Othe ...

  9. HDU 4394 Digital Square

    Digital Square Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. 基于Visual C++2013拆解世界五百强面试题--题2-输出和为一个给定整数的所有组合

    请用C语言实现 输出和为一个给定整数的所有组合 启动2012 /* 请用C语言实现 输出和为一个给定整数的所有组合 */ #include <stdio.h> //包含头文件stdio.h ...

  2. Oracle 使用RMAN

    RMAN 数据库备份 特点: . 跳过未使用的数据块 . 备份压缩 . 执行增量备份 . 块级别的恢复 组件: . RMAN命令执行器(RMAN Executable) . 目标数据库(Traget ...

  3. Libev学习笔记1

    和Libevent相似,Libev是一个高性事件驱动框架,据说性能比Libevent要高,bug比Libevent要少.Libev只是一个事件驱动框架,不是网络库,因为它的内部并没有任何socket编 ...

  4. Scrambled Polygon(斜率排序)

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7799   Accepted: 3707 ...

  5. HTTP协议是无状态协议,怎么理解?

     Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的全部信息外,该环境不保存与会话有关的不论什么信息. 自己的理解,在 ...

  6. Ext JS学习第十天 Ext基础之 扩展原生的javascript对象(二)

    此文来记录学习笔记: 今天继续说Ext.Array,Ext.Function,Ext.Date,Ext.Error ------------------------------------------ ...

  7. GCD详细使用笔记

    第一.通过GCD创建队列(Queue) 创建队列方式有以下几种: 1.创建一个串行队列: dispatch_queue_t queue =dispatch_queue_create("串行队 ...

  8. hadoop的集群安装

    hadoop的集群安装 1.安装JDK,解压jar,配置环境变量 1.1.解压jar tar -zxvf jdk-7u79-linux-x64.tar.gz -C /opt/install //将jd ...

  9. BZOJ 1898: [Zjoi2004]Swamp 沼泽鳄鱼( dp + 矩阵快速幂 )

    ----------------------------------------------------------------------- #include<cstdio> #incl ...

  10. 解决虚拟内存不够导致Eclipse is not responding

    安装目录下eclipse.ini中: 修改参数至必要大小. e.g. -vmargs-Djava.net.preferIPv4Stack=true-Dosgi.requiredJavaVersion= ...