NOJ [1267] Flying Chess

来源:互联网 发布:百度派 知乎 编辑:程序博客网 时间:2024/06/05 18:56
链接地址:http://ac.nbutoj.com/Problem/view.xhtml?id=1267

博弈题

当 n <= 6 时,tt可以将棋子直接走到终点,所以都是tt wins。
当 n == 7 时,我们可以这样考虑:
当tt走 1 步,那么路程还剩下 6 ,mengya可以一步走到终点。
当tt走 2 步,那么路程还剩下 5 ,mengya可以一步走到终点。
当tt走 3 步,那么路程还剩下 4 ,mengya可以一步走到终点。
当tt走 4 步,那么路程还剩下 3 ,mengya可以一步走到终点。
当tt走 5 步,那么路程还剩下 2 ,mengya可以一步走到终点。
当tt走 6 步,那么路程还剩下 1 ,mengya可以一步走到终点。
从中你发现规律了吗?
这个规律就是当tt走了 x 步后,那么剩下的步骤就是 n - x 步,
那么答案就归结到了对 n - x 步做讨论。
但是,对于剩余 n - x 步,我们之前讨论过了,之前的 n - x 步的主角就是现在应该下棋的那个人的对手tt,如果tt在走前面的剩余 n - x 步时是win的,那么此时的mengya走 n - x 步时就是win的。这就是突破口,没想懂的仔细想想。

以下是我的出题代码。
#include <set>
#include <list>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

int a[100010];

int main()
{
int n;

//freopen("in.in", "r", stdin);
//freopen("out.out", "w", stdout);
a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = 1;
for (int i = 7; i <= 100000; i++)
{
if (a[i - 1] == 1 && a[i - 2] == 1 && a[i - 3] == 1 && a[i - 4] == 1 && a[i - 5] == 1 && a[i - 6] == 1) a[i] = 0;
else a[i] = 1;
}
while (~scanf("%d", &n))
{
if (a[n]) printf("tt wins\n");
else printf("mengya wins\n");
}

return 0;
}


0 0
原创粉丝点击