UVA10561 Treblecross

Treblecross

 题目大意:给定一个带有.和X的字符串作为初始局面,两人轮流游戏,将.修改为X,当一个人放下X后,出现三个连续的X,游戏接触,放下X的人获胜。判断先手必胜还是必败,并给出第一步到达必胜局面的所有放法。

 

对于X.X或..XX..的情况:特殊判断有解并输出即可

 

其他情况:每个X旁边都有四个禁区(左右各两个),禁区用i表示,即..iiXii...,显然放到i这个地方是先手必败的

把整张图的禁区全部标记出来,问题变成了往没被标记的区域放X,没放一个X将有iiXii中的i被标记,被标记的格子不能走,问先手必胜/必败

每一段没被标记的区域都是一个子游戏,sg[i]表示长度为i的子游戏sg值

预处理即可

方案只需要枚举第一步走到哪里,重新判断该局面的SG函数是否为0即可

 

被空格和换行各种卡PE或WA。。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <algorithm>
  6 #include <queue>
  7 #include <vector>
  8 #include <cmath> 
  9 #define min(a, b) ((a) < (b) ? (a) : (b))
 10 #define max(a, b) ((a) > (b) ? (a) : (b))
 11 #define abs(a) ((a) < 0 ? (-1 * (a)) : (a))
 12 inline void swap(int &a, int &b)
 13 {
 14     int tmp = a;a = b;b = tmp;
 15 }
 16 inline void read(int &x)
 17 {
 18     x = 0;char ch = getchar(), c = ch;
 19     while(ch < '0' || ch > '9') c = ch, ch = getchar();
 20     while(ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();
 21     if(c == '-') x = -x;
 22 }
 23 const int INF = 0x3f3f3f3f;
 24 const int MAXN = 1000;
 25 int t,sg[MAXN + 10],n,b[MAXN + 10],x[MAXN + 10],tot;
 26 char s[MAXN + 10];
 27 void make_sg()
 28 {
 29     sg[0] = 0;sg[1] = sg[2] = sg[3] = 1;
 30     for(register int i = 4;i <= MAXN;++ i) 
 31     {
 32         memset(b, 0, sizeof(b));
 33         for(register int j = 3;j <= i;++ j)
 34             b[sg[max(0, j - 5)] ^ sg[max(i - j, 0)]] = 1;
 35         for(register int j = 0;j <= i;++ j)
 36             if(!b[j])
 37             {
 38                 sg[i] = j;
 39                 break;
 40             }
 41     }
 42 }
 43 //检验特殊情况 
 44 bool check()
 45 {
 46     //单独处理x坐标 
 47     memset(b, 0, sizeof(b));
 48     tot = 0;
 49     for(register int i = 1;i <= n;++ i) if(s[i] == 'X') x[++tot] = i;
 50     int flag = 0;
 51     for(register int i = 2;i <= tot;++ i)
 52         if(x[i] == x[i - 1] + 1)
 53         {
 54             if(x[i] >= 3) b[x[i] - 2] = 1;
 55             b[x[i] + 1] = 1, flag = 1;
 56         }
 57         else if(x[i] == x[i - 1] + 2) 
 58             b[x[i] - 1] = 1, flag = 1;
 59     if(flag)
 60     {
 61         printf("WINNING\n");
 62         int pre = -1;
 63         for(register int i = 1;i <= n;++ i) 
 64         {
 65             if(b[i])
 66             {
 67                 if(pre != -1) printf("%d ", pre);
 68                 pre = i;
 69             }
 70         }
 71         if(pre != -1) printf("%d", pre);
 72         putchar('\n');
 73         return 1;
 74     }
 75     return 0; 
 76 } 
 77 int main()
 78 {
 79     read(t);make_sg();
 80     for(;t;--t)
 81     {
 82         scanf("%s", s + 1);n = strlen(s + 1);
 83         int sum = 0;
 84         if(check())
 85             continue;
 86         int l = 0;
 87         for(register int i = 1;i <= tot;++ i)
 88         {
 89             if(x[i] - 3 - l >= 0) sum ^= sg[x[i] - 3 - l];
 90             l = x[i] + 2;
 91         }
 92         if(n - l >= 0) sum ^= sg[n - l];
 93         if(!sum)
 94         {
 95             printf("LOSING\n\n");
 96             continue;
 97         }
 98         printf("WINNING\n");
 99         memset(b, 0, sizeof(b));
100         for(register int i = 1;i <= tot;++ i)
101         {
102             if(x[i] - 1 > 0) b[x[i] - 1] = 1;
103             if(x[i] - 2 > 0) b[x[i] - 2] = 1;
104             b[x[i]] = b[x[i] + 1] = b[x[i] + 2] = 1; 
105         }
106         int pre = -1;
107         for(register int i = 1;i <= n;++ i)
108         {
109             if(b[i]) continue;
110             //在i这个位置放X
111             if(i - 1 > 0) ++ b[i - 1];
112             if(i - 2 > 0) ++ b[i - 2];
113             ++ b[i]; ++ b[i + 1]; ++ b[i + 2];
114              
115             int nsum = 0;
116             int l = 0;
117             b[n + 1] = 1;
118             for(register int j = 1;j <= n + 1;++ j)
119             {
120                 if(!b[j] && !l) l = j;
121                 else if(b[j] && l) nsum ^= sg[j - l], l = 0;
122             }
123             if(!nsum)
124             {
125                 if(pre != -1) 
126                     printf("%d ", pre);
127                 pre = i;
128             }
129             if(i - 1 > 0) -- b[i - 1];
130             if(i - 2 > 0) -- b[i - 2];
131             -- b[i]; -- b[i + 1]; -- b[i + 2];
132         }
133         if(pre != -1) printf("%d", pre);
134         putchar('\n');
135     }
136     return 0;
137 } 
UVA10561

 

转载于:https://www.cnblogs.com/huibixiaoxing/p/8310558.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决VS2005 远程工具无法通过同步软件连接S5pv210 样机的问题

居然无法连接&#xff0c;记得以前遇到过的 1 分钟前 上传下载附件 (58.21 KB)后来还是看MSDN解决了MSDN连接如下http://msdn.microsoft.com/en-us/library/ee480836.aspx——Troubleshooting a Connection to a Target Device That Uses Platform Manager 转载一下sunrain_hjb…

一些应该记住的东西(持续更新?再也不会更新了)

没什么用的目录 1.积性函数与杜教筛 2.搜索的几种优化与考试期望得分 3.乱讲 4.模拟退火系列 5.生成函数系列 2018.1.18 首先写写数学方面的吧(因为现在在学)……毕竟这里面的公式浩如烟海…… 对着表推了十分钟愣是没发现……明明上午还证明过…… 还有就是通过算贡献化简一些…

传说中的window8 的种子

2019独角兽企业重金招聘Python工程师标准>>> 趁着更新服务器最后时刻 发个种子 有兴趣的可以去看看 http://dl.dbank.com/c03a8fck07 转载于:https://my.oschina.net/qutterrtl/blog/28368

软件测试5未来大发展路线,测试工程师发展偏向

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试的五大…

linux 文件夹换所属用户,linux普通用户su root切换提示没有文件或目录的解决方法...

1. 首先进入单用户模式&#xff1a;1). ubuntu :上述情况可以在grub界面选择第二项修复&#xff0c;但没有grub可以参考&#xff1a;1、重启ubuntu&#xff0c;随即长按shirft进入grub菜单&#xff1b;2、选择recovery mode&#xff0c;按"e"键进入编辑页面&#xff…

排序算法[转]

笔者最近学习算法&#xff0c;学了很久也只弄懂了几个排序算法&#xff0c;在这里晒一下下&#xff0c;作为以后参考之用。 一、为什么要研究排序问题 许多计算机科学家认为&#xff0c;排序算法是算法学习中最基本的问题&#xff0c;原因有以下几点&#xff1a; l 有时候应用…

sonar做代码检测时如何忽略一些代码文件

1、管理员登录sonar 2、如图 一条规则配置一个&#xff0c;不要填写逗号或者分号分割的多个规则 转载于:https://www.cnblogs.com/shengulong/p/8324764.html

回车符和换行符

2019独角兽企业重金招聘Python工程师标准>>> 首先转一段关于回车和换行的历史。 回车和换行 关于“回车”&#xff08;carriage return&#xff09;和“换行”&#xff08;line feed&#xff09;这两个概念的来历和区别。 在计算机还没有出现之前&#xff0c;有一种…

linux新建好文件后怎么编译,使用autoconf生成Makefile并编译工程的步骤

前言在Linux下&#xff0c;编译和链接需要用Makefile&#xff0c;而写好一个Makefile可不容易&#xff0c;写出一个规范的Makefile更是麻烦。我们可以利用autoconf来生成一个Makefile&#xff0c;尤其在大型工程里&#xff0c;能省去很多麻烦。这里我会用一个工程来说明怎么做&…

前端跨域的那些事

这一节&#xff0c;我们来讲一讲&#xff0c;前端跨域的那些事&#xff0c;主要分成这样的几部分来讲解&#xff0c; 一、为什么要跨域&#xff1f; 二、常见的几种跨域与使用场景 2.1 JSONP跨域 2.2 iframe跨域 2.3 window.name 跨域 2.4 document.domain 跨域 2.5 cookie跨域…

维护SAP帮助信息(WEB)

维护SAP帮助信息&#xff08;WEB&#xff09; 1、首先进入000 Client &#xff0c;然后scc4修改000的模式 2、spro 3、 4、 5、注意 服务器为&#xff1a;http://help.sap.com 路径为&#xff1a;saphelp_erp60_sp/helpdata 转载于:https://blog.51cto.com/anhwei/626111

读jQuery之十二(删除事件核心方法)

使用jQuery删除事件&#xff08;或称解除事件绑定&#xff09;有三个函数&#xff1a;unbind、die和undelegate。这三个方法都依赖于未公开的jQuery.event.remove&#xff08;后续使用remove简写&#xff09;。此为删除事件的核心方法。remove 所作的事情与上一篇提到的.add 刚…

像Excel一样使用python进行数据分析(1)

&#xff08;虽然是转载&#xff0c;但是是我每块都测试过得&#xff0c;容易出问题的地方我会添加一些自己的经验&#xff0c;仅供参考&#xff09; 像Excel一样使用python进行数据分析&#xff08;2&#xff09; 像Excel一样使用python进行数据分析&#xff08;3&#xff09;…

Xshell配置ssh免密码登录-密钥公钥(Public key)

1 简介 ssh登录提供两种认证方式&#xff1a;口令(密码)认证方式和密钥认证方式。其中口令(密码)认证方式是我们最常用的一种&#xff0c;这里介绍密钥认证方式登录到linux/unix的方法。 使用密钥登录分为3步&#xff1a; 1、生成密钥&#xff08;公钥与私钥&#xff09;&#…

linux vim ctags,Linux环境上代码阅读与编写的利器-vim+ctags+cscope

Linux环境下代码阅读与编写的利器----vimctagscscope所谓工欲善其事&#xff0c;必先利其器。从事Linux程序开发&#xff0c;特别是Linux驱动程序的开发&#xff0c;不管是通过windows下虚拟一个Linux,还是通过samba访问Linux都是很郁闷的事情。原因就是程序本身需要Linux的编译…

oracle vm中的xp添加共享文件夹

接着就可以在虚拟的电脑系统里面打开我们的共享文件夹&#xff0c;在桌面找到”网络邻居“&#xff0c;双击打开 我们需要通过”添加一个网络邻居“来加载我们刚才添加的”共享文件夹“&#xff0c;根据向导一步步执行 然后点击”浏览“ 展开前面的 ”“ visualBox shared fold…

MSBuild + MSILInect实现编译时AOP-改变前后对比

实现静态AOP&#xff0c;就需要我们在预编译时期&#xff0c;修改IL实现对代码逻辑的修改。Mono.Cecil就是一个很好的IL解析和注入框架&#xff0c;参见编译时MSIL注入--实践Mono Cecil(1)。 我的思路为&#xff1a;在编译时将加有继承制MethodInterceptBaseAttribute标签的原方…

惊人体积,无码改造,黑月V1.7.4增强版[20110810]

使用方法:替换 易语言 LIB目录下的黑月支持库 记得备份 去掉代码长度过少不能编译的限制.(比如空代码) 优化编译出来的文件体积大小.(exe貌似没问题,dll貌似也没问题,就是dll对体积的优化不会太多) 体积减少了N倍...不解释,不解释,高手懂得... 转载于:https://blog.51cto.com…

linux stm32 ide,一文教你如何在ubuntu上快速搭建STM32 CubeIDE环境(图文超详细+文末有附件)...

在快速ubuntu上安装cubeide你值得拥有&#xff1b;适合对linux系统还不是很熟悉的同学&#xff1b;1 下载 cubeide登陆官网&#xff0c;下载链接不知道是否有效&#xff0c;如果无效&#xff0c;需要提交自己的邮箱地址&#xff0c;ST官方会将下载链接发送至你的邮箱&#xff0…

思科(Cisco)路由器策略路由配置详解

策略路由是路由优化的常用方法。在做路由牵引时很多情况都要用到策略路由。 网络拓扑 R2的E1\E2口分别与R3的E1\E2口相连。 先配置好静态路由&#xff0c;使192.168.2.X与192.168.1.X互通(不经过R3)。即R1<->R2<->R4是互通的。 下面介绍一下配置策略路由的方法。 实…