UVa 10561 Treblecross (SG函数)】的更多相关文章

题意:给定上一行字符串,其中只有 X 和 . 并且没有连续的三个 X,两个玩家要分别在 . 上放 X,如果出现三个连续的 X,则该玩家胜利,现在问你先手胜还是败,如果是胜则输出第一步可能的位置. 析:首先,如果输入中出现了 XX 或者 X.X,那么先手必胜,这种可以先处理,然后考虑剩下的,首先每个玩家肯定不能放X-1,X-2,X+1,X+2的位置,其中 X 表示格子X中已经是 X 了,因为一放上,那么下一个玩家就一定能胜利,除非没有其他地方可以放了,那么游戏也就可以终止了,然后除了这些地方,那么…
UVA 10561 - Treblecross 题目链接 题意:给定一个串,上面有'X'和'.',能够在'.'的位置放X.谁先放出3个'X'就赢了,求先手必胜的策略 思路:SG函数,每一个串要是上面有一个X,周围的4个位置就是禁区了(放下去必败).所以能够以X分为几个子游戏去求SG函数的异或和进行推断.至于求策略.就是枚举每一个位置就能够了 代码: #include <stdio.h> #include <string.h> #include <algorithm> u…
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32209 [思路] 博弈论. 根据X分布划分禁区,每个可以放置的块为单独一个游戏.按长度定义状态,构造sg函数.依次试验每一种放法. [代码] #include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std;…
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1502 博弈 SG  不可以使出现 XX 或者 X.X的情况,这样下一个人就赢了 枚举每个.将其变成X 看是否可以让对手输 1,已经出现了  XXX  对手已输 2,如果正好出现了  XX 或者 X.X  对手赢 3,如果一个地方的.变成X   不会出现XX或者X.X  把这些地方分成一个个的…
UVA 11534 - Say Goodbye to Tic-Tac-Toe 题目链接 题意:给定一个序列,轮流放XO,要求不能有连续的XX或OO.最后一个放的人赢.问谁赢 思路:sg函数.每一段...看成一个子游戏,利用记忆化求sg值,记忆化的状态要记录下左边和右边是X还是O就可以 代码: #include <stdio.h> #include <string.h> const int N = 105; int t, sg[3][3][N]; char str[N]; int g…
Problem C Treblecross Input: Standard Input Output: Standard Output Time Limit: 4 Seconds Treblecross is a two player game where the goal is to get three X in a row on a one-dimensional board. At the start of the game all cells in the board is empty.…
UVA 11927 - Games Are Important option=com_onlinejudge&Itemid=8&page=show_problem&category=478&problem=3078&mosmsg=Submission+received+with+ID+13891171" target="_blank" style="">题目链接 题意:给定一个有向图,结点上有一些石头,两人轮流…
题意:给你一串含“.”和“X”的字串,每次一个玩家可以把‘."变成“X”,谁先弄到三个XXX就赢.假如先手必赢,输出所有能必赢的第一步,否则输出0. 思路:显然如果一个X周围两格有X那么肯定能一步变成XXX,所以两个人都要避免在自己回合产生这种情况.如果一开始就存在上述情况,那么肯定是那一步.否则我遍历每一个空格看看能不能下这一步.满足我在这个空格变成“X”不会造成上述情况,然后算出nim和是否留给对手一个必败态. 设sg[x]表示长度为x的空格的sg函数,然后我遍历1~x位置变成“X”,那么空…
题意:一个 1 × n 的棋盘,有 X 和 :,当棋盘上出现三个连续的X 时游戏结束,两人轮流操作,每次能把一个 : 变成 X,问先手必胜方案数以及先手可以放的位置. /* 对于先手,当有一个'X'时,它周围的两个格子就都不能放'X'了,所以这样游戏就被分成了几个部分,据此设定SG函数. */ #include<iostream> #include<cstdio> #include<cstring> #define N 210 using namespace std;…
题意:有n个格子排成一行,其中一些格子里面有字符X.两个游戏者轮流操作,每次可以选一个空格,在里面放上字符X. 如果此时有3个连续的X出现,则该游戏者赢得比赛.初始条件下不会有3个X连续出现. 判断先手胜负情况,若必胜则升序输出先手第一步的所有可选必胜策略 n<=200 思路:如果有XX或者X.X出现则一定先手胜 一个结论:X的旁边和旁边的旁边不能放X 于是整个游戏被不能放X的区域分成了若干个独立的片段,每次都可以选择一个片段进行游戏,就是若干个游戏的和 由于每个棋盘片段都是连续的,想到用一个正…