1 条题解

  • 0
    @ 2025-8-24 22:29:03

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 樱雪喵
    无尽欺骗,无限祈愿 | AFOed | qq: 3480681868

    搬运于2025-08-24 22:29:03,当前版本为作者最后更新于2021-02-15 23:11:44,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    偷偷来水篇题解(((

    注:在本篇题解中, KK 表示国王, NN 表示骑士,不同颜色的 XX 表示该位置国王可以达到,且被与之相同颜色的骑士封锁。方法不唯一,图中的方法仅作示例。

    根据题目,可以得到国王所在的位置分为三种情况:

    • 在角上
    • 在边上
    • 在中间

    因此我们分别考虑这三种情况所需要的骑士个数。

    在角上

    如图,可以看到国王有三个位置可以走,两个骑士就可以封住。

    在边上

    如图,国王有五个位置可以走,要用三个骑士。

    在中间

    如图,八个位置共需四个骑士,其中国王无法吃掉蓝色和绿色的骑士,因为不论国王往左还是往右移动橙色骑士都会直接吃掉国王。

    把上面的规律总结一下, 33 个位置 -> 22 个骑士; 55 个位置 -> 33 个骑士; 88 个位置 -> 44 个骑士。其实答案也就是 x2\lceil \frac{x}{2} \rceil 。 ( xx 表示国王身边的位置数量)

    代码实现直接分类讨论会比找规律好写一点,所以这里写的是分类讨论qwq

    code:code:

    #include<bits/stdc++.h>
    using namespace std;
    int t,m,n,x,y,ans;
    int main()
    {
    	scanf("%d",&t);
    	while(t--)
    	{
    		scanf("%d%d%d%d",&m,&n,&x,&y);
    		if((x==1&&y==1)||(x==m&&y==n)||(x==1&&y==n)||(x==m&&y==1)) cout<<"2"<<endl;//在角上
    		else if(x==1||x==m||y==1||y==n) cout<<"3"<<endl;//在边上
    		else cout<<"4"<<endl;//如果都不在就是在中间
    	}
    	return 0;
    }
    

    看题解不点赞就过分了啊qaq

    • 1

    信息

    ID
    5629
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者