格子游戏(c++)

小A与小B面对面站在一条直线的两个端点上,在他们中间有N个方格,小A与小B轮流向前移动M个格子,1<=M<=3,首先是小A向前移动,再是小B移动,然后又是小A移动。当轮到谁进行移动时,而他又无法移动时,这个人就输了。也就是在小A与小B之间已没有方格时,此时轮到谁移动,谁就输了。 例如当N=10时

Format

Input

一行给出数字N

Output

如果小A有必胜的方法,输出"Yes“,否则输出”No"

思路:假设n=10

A___ ___ ___ ___ ___ ___ ___ ___ ___ ___ B

首先是小A移动,他向前移动2个格子,形成如下局面

___ A_ ___ ___ ___ ___ ___ ___ ___ ___B

接下来小B向前移动1个格子,形成如下局面

___ A_ ___ ___ ___ ___ ___ ___ ___ B_

轮到小A移动,他向前移动3个格子,形成如下局面

___ ___ ___ ___ A_ ___ ___ ___ ___ B_

再轮到小B移动,他向前移动1个格子,形成如下局面

___ ___ ___ ___ A ___ ___ ___ B ___

轮到小A移动,他向前移动3个格子,形成如下局面

___ ___ ___ ___ ___ ___ ___ AB_ ___

此时轮到B移动了,但此时A、B之间已没有格子了,B无法再向前移动了,于是B输了这场比赛。

所以,知道小A第一个移动,那我们就让一个能凑出来的数当倍数,那么就是4了,那么这样,小A要先把n凑到4的倍数,然后就和小B凑4

小B出3,小A出1,3+1=4

小B出2,小A出2,2+2=4

小B出1,小A出3,1+3=4

所以当n是4的倍数时,小B才会赢

CODE:

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;

    if (n % 4 != 0)//判断倍数
        cout << "Yes" << endl;
    else
        cout << "No" << endl;

    return 0;
}

Guess you like

Origin blog.csdn.net/weixin_55599629/article/details/119964965