首页 > 其他分享 >题解:CF362A Two Semiknights Meet

题解:CF362A Two Semiknights Meet

时间:2024-08-20 18:07:44浏览次数:7  
标签:... .. 格子 题解 棋子 Semiknights ........ Meet equiv

题意

有两个走法为中国象棋象的棋子,棋盘上有一些坏格子,问它们是否可以在好格子相遇。

思路

则判断两个棋子是否相遇有两个条件

  1. 是否可以在一个格子相遇。
  2. 那个格子是否是好格子。

先考虑条件 \(1\)

设第一个棋子的坐标为 \(a_x\) 和 \(a_y\),第二个棋子的坐标为 \(b_x\) 和 \(b_y\)。
则在一盘棋中第二个棋子可以走的地方为
这里设第一个棋子的坐标为 \((1,1)\)。

0 12345678
1 K...X...
2 ........
3 ..X...X.
4 ........
5 X...X...
6 ........
7 ..X...X.
8 ........

那么第二个棋子的坐标就应该在图中标了 \(X\) 的位置。
但是实际会比这个更少。
把每个格子到第一个棋子的步数进行标记,得

0 12345678
1 0...2...
2 .\./.\..
3 ..1...3.
4 ./.\./..
5 2...2...
6 .\./.\..
7 ..3...3.
8 ........

奇数格子的棋子下一步到的是偶数格子,偶数格子的棋子的下一步到的是奇数格子,所以要想让两个棋子相遇,则第二个棋子的位置应为偶数标记的格子,就是图中标记为 \(2\) 的格子。
观察图可知,若想使两个棋子都到达同一个位置,那么可得

\[a_x \equiv\ b_x \ (mod \ 4 ) \]

\[a_y\equiv\ b_y \ (mod \ 4) \]

化简,得

\[a_x-b_x \equiv\ 0 \ (mod \ 4 ) \]

\[a_y-b_y \equiv\ 0 \ (mod \ 4 ) \]

所以只要判断两个棋子的 \(x\) 和 \(y\) 坐标相差是否能被 \(4\) 整除就行了。

再来考虑条件 \(2\)

题目中说了,两个棋子最开始的位置一定是个好格子,所以只要让一个棋子来回走一个棋子走到了一个棋子的位置即可。所以本条不用考虑。

AC code

#include<bits/stdc++.h>
using namespace std;
int n,ax,ay,bx,by;
bool first=1;
char ch;
int main(){
	cin>>n;
	while(n--){
		first=1;
		ax=0,ay=0,bx=0,by=0;
		for(int i=1;i<=8;i++){
			for(int j=1;j<=8;j++){
				cin>>ch;
				if(ch=='K'){
					if(first){
						ax=i,ay=j;
						first=0;
					}else{
						bx=i,by=j;
					}
				}
			}
		}
		if((ax-bx)%4||(ay-by)%4) cout<<"NO"<<endl;
		else cout<<"YES"<<endl;
	}
	return 0;
} 

标签:...,..,格子,题解,棋子,Semiknights,........,Meet,equiv
From: https://www.cnblogs.com/bubble-sort/p/18369986

相关文章

  • NOI2003 逃学的小孩 题解
    NOI2003逃学的小孩题解传送门。题目简述给定一棵树\(T\),需要选择三个点\(A,B,C\),需要从\(C\)走到\(A,B\)​​的最远距离。(第一段题目是在讲剧情吗。。)前置知识图树树的直径思路简述这题在蓝题(提高+/省选-)中还是比较水的^_^来看看样例吧用瞪眼法(——数学......
  • 题解:CF991D Bishwock
    思路考虑贪心。从左往右扫,找到一个就标记一个即可。但是要注意,当遇见这种情况时000000最优的方法是左右各放一个积木,共放入两块。但如果按照刚刚的方法,则有可能会是这样0X0XX0所以在一些地方有多种放法时,应该优先放置开口朝右的积木。ACCode#include<bits/stdc++.h>......
  • 题解:AT_abc365_c [ABC365C] Transportation Expenses
    题意已知\[\sum_{i=1}^{n}\min(x,a_i)\lem\]问\(x\)最大为多少。思路由于答案具有单调性,所以考虑二分答案。但是有一点要注意,当\(\sum_{i=1}^{n}a_i\lem\)时,应该输出infinite。因为此时的\(x\)可以为任意一个数。ACcode#include<bits/stdc++.h>#defineintun......
  • 题解:CF997A Convert to Ones
    题意给定一个长度为\(n\)的01字符串,有以下两种操作:将一个子串翻转,花费\(X\)将一个子串进行取反,花费\(Y\)求把原字符串变为全是\(1\)的字符串的最小代价。思路只有\(2\)操作的情况下贪心策略。考虑到任意范围取反的花费相同,我们可以将相同的部分合并,如下图合并......
  • 题解:P10696 [SNCPC2024] 写都写了,交一发吧
    前置知识位运算按位与的运算规则:二进制下,相同位的两个数字都为\(1\),则为\(1\);若有一个不为\(1\),则为\(0\)。分析由按位与的运算规则可以得到:\(A\&A=A\),而题目中的两次提交可以是相同的,所以两次都只需要取\(n\)个数中最大的数即可。ACcode#include<bits/stdc++.h>us......
  • 题解:UVA486 English-Number Translator
    这是一道模拟题。前置知识数级思路当读取到了thousand和million时,计数器要乘上对应的值并累加到最终答案里,并且把计数器归零(因为该数级已经计算完了)。当读取到hundred时,只要计数器乘上\(100\)。否则如果是其他数,则直接累加到计数器即可。ACcode#include<bits/st......
  • 题解:P10722 [GESP202406 六级] 二叉树
    思路朴素做法当输入\(a_i\)后,直接将它及它的子树进行变换。而这样时间会超时。预计得分\(40\)pts。正解统计每次变换的节点编号,第\(i\)个节点作为根节点进行子树变换的次数为\(rec_i\)。最后从这棵树的根节点\(1\)开始向下dfs,则每个节点变换的次数为\[rec_i+k_j\]......
  • 题解:UVA12398 NumPuzz I
    题意给你一个操作顺序,每个字母代表一个格子的操作。每次操作都会将一个格子及它相邻的格子的值\(-1\),如果格子的值为\(0\),则会变成\(9\)。已知操作完成后的所有格子值都为\(0\),求最开始每个格子的值为多少。思路模拟过程。倒推出得出答案。如果原操作\(-1\),那么现操作在......
  • 题解:UVA13026 Search the Khoj
    题意&翻译输入\(T\)组数据,每行数据有\(n\)个电话号码,最后再输入一行电话号码\(t\)。输出前面与\(t\)相差不超过一个字符的电话号码。思路把前面的\(n\)个电话号码逐个与\(t\)比较即可。ACcode#include<bits/stdc++.h>usingnamespacestd;intT,n;stringm[10......
  • 题解:P8887 [DMOI-R1] 柯基棋
    本题题意小A和小B在一个\(n\timesn\)的棋盘里下柯基棋,当一个人不能再放下棋子时,他就输了。问谁会有必胜策略。思路先不考虑小C的捣乱。分类讨论当\(n\)为奇数时,不难得出:当小A第一步放在棋盘的正中心时,以后不管小B放在哪里,小A只要放在它的对称处就行了。这......