首页 > 其他分享 >题解:P7356 「PMOI-1」游戏

题解:P7356 「PMOI-1」游戏

时间:2024-10-14 18:43:41浏览次数:1  
标签:PMOI P7356 黑方 题解 long 落子 && define cout

Problem Link

「PMOI-1」游戏

题意

给你一个胜利规则为 黑白白白 的棋类游戏,你执白,黑先行且第一步必下 \((0,0)\),双方皆可放弃落子且落子坐标必须为自然数,请在 4 步内获胜。

思路

在自己与自己对下几局之后,有几个显然的发现:

  • 黑棋会尽量阻止你 4 步获胜。

  • 在你不会再下一步就获胜前,黑棋弃子非常合理(因为黑子多下会多提供获胜必须的 )。

综合思考,发现必须要让你落一子后黑子也落子才有获胜之机。

如何做到这个呢?

思考几下,发现:假设黑棋第二步必弃子

此时不论黑方怎么落子我们都胜了,所以我们第一步下 2 时黑方必须下 1 或 3 或 4。把它展开到二维时在模拟几下,发现第一步下 \((2,2)\) 时,继续在另一处构造上图情况即可。

其他疑问见代码及注释。

// written by Naught

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
// #define int long long
#define Maxn 105
#define fo(i, l, r) for (int i = l; i <= r; ++i)
#define fr(i, r, l) for (int i = l; i >= r; --i)
// #define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
// char buf[1<<21], *p1 = buf, *p2 = buf;
// inline int read(int x=0, bool f=0, char c=getchar()) {for(;!isdigit(c);c=getchar()) f^=!(c^45);for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);return f?-x:x;}
// inline ll lread(ll x=0, bool f=0, char c=getchar()) {for(;!isdigit(c);c=getchar()) f^=!(c^45);for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);return f?-x:x;}
// void train() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);}

int main()
{
    // T = read();
    int T, x, y;
    cin >> T ;
    while (T--)
    {

        cout << "2 2" << endl; cin >> x >> y;
        if ((x == 1 && y == 1) || (x == 3 && y == 3) || (x == 4 && y == 4)) // 黑方堵你
        {
            cout << "0 3" << endl; cin >> x >> y;
            if (x == 0 && y == 2)
            {
                cout << "3 2" << endl; cin >> x >> y;
                if (x == 1 && y == 2) cout << "4 2" << endl;
                else cout  << "1 2" << endl; // 黑方摆了
            }
            else if(x == 0 && y == 4)
            {
                cout << "3 1" << endl; cin >> x >> y;
                if(x == 1 && y == 3) cout << "4 0" << endl;
                else cout << "1 3" << endl; // 黑方摆了
            }
            else if(x == 0 && y == 1)
            {
                cout << "0 4" << endl; cin >> x >> y;
                if(x == 0 && y == 2) cout << "0 5" << endl;
                else cout << "0 2" << endl; // 黑方摆了
            }
            else
            {
                cout << "0 2" << endl; cin >> x >> y;
                if(x == 0 && y == 1) cout << "0 4" << endl;
                else cout << "0 1" << endl; // 黑方摆了
            }
        }
        else // 黑方摆了
        {
            cout << "3 3" << endl;
            cin >> x >> y;
            if(x == 1 && y == 1) cout << "4 4" << endl;
            else cout << "1 1" << endl; // 黑方摆了
        }
    }
    return 0;
}

/*
    自己与自己对下以发现规律
    不懂时多画图
*/

Tips

  • 第一步交互库走的 \((0,0)\) 无需输入。

标签:PMOI,P7356,黑方,题解,long,落子,&&,define,cout
From: https://www.cnblogs.com/naughty-naught/p/18464764

相关文章

  • 题解:AT_agc027_b [AGC027B] Garbage Collector
    ProblemLink[AGC027B]GarbageCollector题意原题翻译已经很不错了,这里不再赘述。思路推论:每次取的垃圾数量应尽可能均分。证明如图,假设有\(4\)个垃圾需要被捡起,有两种取法:取一号垃圾+取二三四号垃圾。取一二号垃圾+取二三号垃圾。前者所需能量为:\(\display......
  • [2024领航杯] Pwn方向题解 babyheap
      [2024领航杯]Pwn方向题解babyheap前言:当然这个比赛我没有参加,是江苏省的一个比赛,附件是XiDP师傅在比赛结束之后发给我的,最近事情有点多,当时搁置了一天,昨天下午想起来这个事情,才开始看题目,XiDP师傅说是2.35版本的libc,确实高版本libc的却棘手,我经验太浅了调试半天,最后让我们......
  • CF360B题解
    简述题意定一个数列\(a\),可以对其中的元素做至多\(k\)次修改,每次修改可以将数列中的一个数改成另一个。求经过修改后,\(max_{i=1}^{n}|a_i-a_{i-1}|\)思路考虑二分答案,对于check函数,我们可以利用dp进行求解。由于修改不太好想,我们可以把问题转换为让不被修改的数最多......
  • CF1814B. Long Legs 题解 枚举
    题目链接:https://codeforces.com/problemset/problem/1814/B题目大意有一个无限大的二维平面,我们用\((x,y)\)来表示平面中横坐标为\(x\)纵坐标为\(y\)的那个位置。一个机器人被放置在该二维平面的\((0,0)\)位置中。该机器人的腿长可以调节。最初,它的腿长为\(1\)。......
  • 【题解】Solution Set - NOIP2024集训Day50 图的连通性相关
    【题解】SolutionSet-NOIP2024集训Day50图的连通性相关https://www.becoder.com.cn/contest/5618「JSOI2012」越狱老虎桥简述题意:题目大意:给定一张图,A先添加\(1\)条边,B再删去一条边使得图不连通,A要最大化删除边的权值,B要最小化删除边的权值,问最终的权值是多少。......
  • qoj8528 Chords 题解
    数据随机有什么用?用你惊人的注意力可以观察到答案的值域在\(800\)附近。考虑暴力dp,设\(dp_{l,r}\)表示值域在\([l,r]\)中最多能选几个区间。假设\(r\)对应区间的左端点为\(lst\),那么有转移方程\(dp_{l,r}=dp_{l,lst-1}+dp_{lst+1,r-1}+1\)。时间复杂度\(O(n^2)\)。......
  • Codeforces Round 978 (Div. 2) A-D1 题解
    我的同学还在VP,排名马上放声明:不要觉得有subtask的题目只做Easyversion没有意义,从这里也能捞很多分,况且有的时候并不是简单和难的区别,而是考不同的算法A.BustoPénjamo题意有一辆车上面有$r$排座位,每排有$2$个座位,现在共$n$个家庭出行坐公交车,每个家庭$a_i$......
  • 洛谷 P2071 座位安排题解
    因为一个人坐一个座位很像二分图,题意转化为二分图最大匹配。把人放在左部,把座位放在右部,一排座位占右部的两个点。假设人想要坐在\(x\)排,那么建图的时候就可以将这个人连向\(2x\)和\(2x+1\)。这样一排就对应着两个人了。由于\(n\le4000\),直接由朴素的\(O(nm)\)的匈牙利......
  • 【题解】CEIT 2024 第三周算法训练 讲义题解
    A.Orange的作文排版关于处理若干行输入,我们可以用while结合getline函数来完成,每次读取一行,就让行数+1,然后每次利用string的size方法得到当前行的列数,更新最长的列,最后得到答案。#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;inta=0;i......
  • 01背包问题/Ieee全球极限编程大赛11.0题BeetleBag题解/洛谷P1926 小书童——刷题大军
    基础01背包问题概述给出一个容积为V的背包,有i个物体,每个物体都有自己的体积和价值,用Vi和Wi表示,要将这些物体装进背包里面,问怎样才能使得装入物体的总价值最大?最大为多少?解决思路1.如果你没能正确理解这道题,尤其是对于很多新手,第一反应可能是将所有物体的单位价值算出来,然后......