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

lndjy
退役oier,偶尔参与比赛出题,tag是我另一个身份,有人认识吗()搬运于
2025-08-24 22:29:04,当前版本为作者最后更新于2020-09-20 07:23:44,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
upd:由于洛谷出了哔哩哔哩嵌套功能,所以在这里加了一份视频题解(之前只有链接)。
官方题解
看起来没啥思路,正难则反。
考虑黑棋要怎么卡白棋。
有一个简单的方法:隔两个一堵。
比如,
黑白时,你应该和第一个黑空两个格子,就是黑白空黑。如果白棋竖着连就竖着这样堵,斜着连就斜着堵。这样一来,白棋永远赢不了。
那么白棋想赢,就要自己占上隔着两个的位置,不让黑棋下。
这时候黑棋很被动,能走的很有限。
接下来考虑必胜策略。
首先,
黑空白白是 步必胜的,我们叫它必胜 。所以,两个黑空白同时出现就是 步必胜的,我们叫它必胜 。容易发现,走完第一步之后,如果黑棋不走它两边的地方,那么白棋下一步即可达到必胜 。
如果走了,就下在 。这时,它与 和 或 (即白棋第一步的两边)都组成了一个
黑空白。然后就达成了一个必胜 。所以,最多 步即可胜利。不明白的话可以看视频题解 https://www.bilibili.com/video/bv1jr4y1N7iA
std:
#include<iostream> using namespace std; int x,y; int main() { int T; cin>>T; while(T--) { cout<<"3 0"<<endl; cin>>x>>y; if(x==2&&y==0) { cout<<"2 2"<<endl; cin>>x>>y; if(x==2) { cout<<"3 3"<<endl; cin>>x>>y; if(x==1&&y==1) cout<<"4 4"<<endl; else cout<<"1 1"<<endl; } else { cout<<"2 3"<<endl; cin>>x>>y; if(x==2&&y==1) cout<<"2 4"<<endl; else cout<<"2 1"<<endl; } } else if(x==4&&y==0) { cout<<"2 2"<<endl; cin>>x>>y; if(x+y==4) { cout<<"3 3"<<endl; cin>>x>>y; if(x==1&&y==1) cout<<"4 4"<<endl; else cout<<"1 1"<<endl; } else { cout<<"1 3"<<endl; cin>>x>>y; if(x==3&&y==1) cout<<"0 4"<<endl; else cout<<"3 1"<<endl; } } else if(x==1&&y==0) { cout<<"4 0"<<endl; cin>>x>>y; if(x==2&&y==0) cout<<"5 0"<<endl; else cout<<"2 0"<<endl; } else { cout<<"2 0"<<endl; cin>>x>>y; if(x==1&&y==0) cout<<"4 0"<<endl; else cout<<"1 0"<<endl; } } return 0; }
- 1
信息
- ID
- 6348
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者