[51nod1329]路径游戏
Snuke与Sothe两个人在玩一个游戏。游戏在一个2*N的网格中进行(2行N列),这个网格中的2N个格子不是黑色就是白色。定义,一条有效路径是指一个完全由白色格子构成的序列,这个序列的第一个网格元素是最左端两个网格之一,最后一个元素是最右端两个网格之一,且在序列中任意两个连续元素在网格中是边相邻的。(任意一个格子与其上下左右四个方向上的网格边相邻,当然在2*N网格中,一个格子只有最多3个相邻的格子。)游戏初始时确保这个网格中存在至少一条有效路径。游戏开始后Snuke与Sothe轮流进行操作,每一次操作需要选择网格中的一个白格并将其涂黑,且操作后的网格中必须依然存在至少一条有效路径。若一个人操作完后网格中不再存在有效路径的话,该操作选手判为输,而另一个选手为赢。假设Snuke与Sothe两人都采用最优策略,且Snuke先手。那么请问对给定的初始网格涂色状态,谁是最终的赢家?
例如,初始状态如下:('.'表示白色,‘#’表示黑色)
#..
...
Snuke必须先手把右下角涂黑,
#..
..#
而此时Sothe将无路可走。
Input
多组测试数据。
第一行一个整数T,表示数据个数,其中1<=T<=5。
接下来3T行,是T组不同的数据。
每组数据由3行构成,其第一行是一个整数N,其中1<=N<=1000
接下来两行每行N个字符,表示网格中每个格子的初始颜色,'.'表示白色,‘#’表示黑色。
Output
每组数据一行输出,输出获胜玩家名字。
直接求SG函数。。sg[i][ztl][ztr]表示中间2*i个全空的格子,再往左右那两列有无障碍格子的状态分别为ztl,ztr 的SG值。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define d double
#define ld long double
const int maxn=,modd=; int sg[][][];
int u[];
char s1[maxn],s2[maxn];
int i,j,k,n,m; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while(rx<''&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>='')ra=ra*+rx-,rx=getchar();return ra*fh;
} inline void getsg(){
int i,ztl,ztr,tim=;register int j;
for(i=;i<=;i++)for(ztl=;ztl>=;ztl--)for(ztr=;ztr>=;ztr--)
if((i>&&ztl!=&&ztr!=)||(!i&&((ztl|ztr)!=))){
tim++;
for(j=;j<i;j++){
if((j>&&j<i-)|| ((j||!(ztl&))&&(j<i-||!(ztr&))) )u[sg[j][ztl][]^sg[i-j-][][ztr]]=tim;
if((j>&&j<i-)|| ((j||!(ztl&))&&(j<i-||!(ztr&))) )u[sg[j][ztl][]^sg[i-j-][][ztr]]=tim;
}//printf("trying: %d %d %d\n",i,ztl,ztr);
if(!ztl&&(i>||!(ztr&)))u[sg[i][][ztr]]=tim;
if(!ztl&&(i>||!(ztr&)))u[sg[i][][ztr]]=tim;
if(!ztr&&(i>||!(ztl&)))u[sg[i][ztl][]]=tim;
if(!ztr&&(i>||!(ztl&)))u[sg[i][ztl][]]=tim; for(j=;u[j]==tim;j++);sg[i][ztl][ztr]=j;//if(i<3)printf(" SG:%d %d %d %d\n",i,ztl,ztr,j);
}else sg[i][ztl][ztr]=;
} int main(){
getsg();
for(int T=read();T;T--){
int len=,SG=;
m=read();
scanf("%s%s",s1+,s2+);
if(m==)SG=(s1[]=='.'&&s2[]=='.')?:;
for(i=;i<=m;i++)
if(s1[i]=='.'&&s2[i]=='.'&&i<m)len++;
else{
int ztl=(s1[i-len-]=='#')<<|(s2[i-len-]=='#'),ztr=(s1[i]=='#')<<|(s2[i]=='#');
// printf("SG:%d %d %d %d\n",len,ztl,ztr,sg[len][ztl][ztr]);
SG^=sg[len][ztl][ztr],len=;
}
puts(SG?"Snuke":"Sothe");
}
}
[51nod1329]路径游戏的更多相关文章
- iTween基础之iTweenPath(自定义路径移动)
在游戏开发中经常会用到让一个游戏对象按照指定的路线移动,iTweenPath就提供了可视化的编辑路径功能. iTweenPath 下载地址: http://download.csdn.net/deta ...
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
- C#开发Unity游戏教程之判断语句
C#开发Unity游戏教程之判断语句 游戏执行路径的选择——判断 玩家在游戏时,无时无刻不在通过判断做出选择.例如,正是因为玩家做出的选择不同,才导致游戏朝着不同的剧情发展,因此一个玩家可以对一个游戏 ...
- iTween基础之iTweenPath浅析(自定义路径移动)
http://www.2cto.com/kf/201604/498023.html 在游戏开发中经常会用到让一个游戏对象按照指定的路线移动,iTweenPath就提供了可视化的编辑路径功能. iTwe ...
- Tower Defense Toolkit 学习
代码太多,就不贴了.用到的基本已注释. 游戏中的数据存放在Resources/Database中.游戏运行时,通过Resources.Load加载 UI构成 对象池 using UnityEngi ...
- ROS机器人导航一 : 从英雄联盟到ROS导航
写在前面: 这是这个系列的第一篇 本系列主要从零开始深入探索ROS(机器人操作系统)的导航和规划. 这个系列的目标,是让大家了解: 1.ROS的导航是怎么实现的 2.认识ROS里各种已有的导航算法,清 ...
- android飞机游戏敌机移动路径
基础android的飞机类游戏,与前人一样,由surfaceView绘制游戏画面,另起线程控制绘制时间间隔达到动态效果.这里附上最近自己写的敌机自动飞行路径代码.请大家给点意见. 在敌机管理模块,加入 ...
- Oculus Store游戏下载默认路径修改方法
最近在测试一款VR游戏,所以在硬件设备上选择了HTC Vive和Oculus两款眼镜.相对而言,HTC安装比较人性化:支持自定义安装路径,而且可在界面更改应用程序下载位置,如图所示: 这下替我节省了不 ...
- 游戏AI之路径规划(3)
目录 使用路径点(Way Point)作为节点 洪水填充算法创建路径点 使用导航网(Navigation Mesh)作为节点 区域分割 预计算 路径查询表 路径成本查询表 寻路的改进 平均帧运算 路径 ...
随机推荐
- iOS sourceTree忽略掉必要的xcuserdata文件
1.找到git对应的文件 git status 结果 会得到已经修改的文件. modified: Zing.xcodeproj/xcuserdata/tiny.xcuserdatad/xcscheme ...
- python 动态加载类对象
第一步 加载模块 module =__import__("modulename",fromlist=['']) 第二部 加载类对象 cls = getattr(module, & ...
- bzoj 2750: [HAOI2012]Road
Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我 ...
- UWP 在Xaml中使用cu和fcu资源
之前一直不知道这个,最近看微软的WTS项目更新,在Xaml中定义了 xmlns:fcu ="http://schemas.microsoft.com/winfx/2006/xaml/pres ...
- ThreadLocal 线程本地变量 及 源码分析
■ ThreadLocal 定义 ThreadLocal通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量 ...
- 浏览器中的user-agent的几种模式
服务器一般会根据访问的浏览器进行识别,针对不同浏览器才用不同的网站样式及结构,也是通过这个信息判断用户使用的平台模式(手机,pc或平板) 识别为手机一般有这几个关键字: "Windows P ...
- Linux下Tomcat重新启动,及kill命令的使用
Linux下Tomcat重新启动,及kill命令的使用 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查 ...
- bug运输[辽宁2014年省队互测一]
奇奇怪怪的题目,不知道他要我们干什么. 我们观察一波局势,发现答案最大不过5.因为如果答案是6或以上的话,我们就至少要2^(5*5)个5*5的方格. 仔细计算一波时间复杂度,再信仰一波,坚信暴力压正解 ...
- NOI 2008 假面舞会
题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号 ...
- android 删除相册图片并同步到图库
private void deleteImage(String imgPath) { ContentResolver resolver = getContentResolver(); Cursor c ...