立方骑士(lgP7354)

来水篇题解(((

图炸了,去洛谷博客看吧。

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

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

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

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

在角上

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

在边上

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

在中间

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

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

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

\(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;
}

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

posted @ 2021-02-15 23:15  樱雪喵  阅读(97)  评论(0编辑  收藏  举报