1 条题解
-
0
自动搬运
来自洛谷,原作者为

Junounly
自有明月照山河,自有山河映明月。搬运于
2025-08-24 22:53:30,当前版本为作者最后更新于2023-12-20 22:25:27,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
很有意思的一道题,
使我的手旋转赛时手玩出结论,为了弥补吃的两发罚时造福后人,写的详细一点题目大意是多组询问,每次给你一个 的方格和一个不超过 个棋子的连通图案,两个人轮流,每次各放一个棋子,直到一方拼出给定图案。若此时棋盘上棋子个数是 的倍数,其获胜;反之另一方获胜。求先手是否必胜。
情况不多,选择分类讨论。
(事实上 ICPC 赛制可以把所有情况都试一遍)令 给定图案的棋子个数。
-
若 ,先手必败。(这不用解释吧)
-
若 ,样例已经解释过了,当先手放下棋子,后手只有两种选择:与或者不与先手放下的棋子组成图案。如果与,那么棋盘上有 颗棋子,先手就赢了;如果不与,先手只需要下 颗棋与刚才的组成图案,棋盘上有 颗棋子,先手还是赢,所以先手必胜。
-
若 ,考虑第 个赢的机会,此时场上有 颗棋子,先手下 颗,后手下 颗,此时先手刚下完,只能先手赢,若先手想赢,那就必须使 颗棋子组成图案,那后手就要尽量避免这种情况,后手只需要在先手下完第 颗棋子后,选 个不可能与那颗棋组成图案的位置即可,所以第 个机会一定用不到;接着考虑第 个赢的机会,此时场上有 颗棋子,先手下 颗,后手下 颗,同理只能后手赢,若后手想赢,就可以直接用这 颗棋子的机会拼出图案,所以先手必败。
-
若 ,同样考虑第 个赢的机会,场上棋子不到 颗,不可能赢;考虑第 个赢的机会,还是先手下 颗,后手下 颗,后手显然有一种策略就是利用先手的第 颗棋和自己的 颗拼出图案,但如果后手无法利用先手的第 颗棋呢?(我赛时就因为这个吃了罚时)
-

-
由于将图案旋转后不会影响结果,所以可以简化成以上 种形状,容易发现,对于形状 和 ,不存在后手无法利用的位置,所以先手必败;对于形状 、 和 ,先手只要下左上角,后手就无法利用这颗棋子,那么后手将失去第 次机会,接下来考虑第 次机会,此时场上有 颗棋子,先手下 颗,后手下 颗,先手虽然已经浪费掉第 次机会来阻止后手利用,但剩下的 颗棋子足够组成图案,所以先手必胜。
经过上面的分类讨论,最终只需要依次判断并输出结果就可以了。
Code:
#include<bits/stdc++.h> using namespace std; int T; int main() { scanf("%d",&T); while(T--) { char c;int cnt=0; int mnx=6,mny=6,mxx=0,mxy=0; for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) { cin>>c; if(c=='o') { cnt++; mnx=min(mnx,i);mny=min(mny,j); mxx=max(mxx,i);mxy=max(mxy,j); } } printf(cnt==2||(cnt==4&&(mxx-mnx>=2||mxy-mny>=2)&&(mxx-mnx<3&&mxy-mny<3))?"Far\n":"Away\n"); } return 0; } -
- 1
信息
- ID
- 9588
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者