[语言月赛 202308] 小粉兔喜欢下象棋吗
题目描述
在中国象棋中,马走日字形。用 ( i , j ) (i,j) (i,j) 表示第 i i i 行第 j j j 列的格点,不考虑别马腿,考虑跳出棋盘外,在 ( i , j ) (i,j) (i,j) 的马可以跳到 ( i − 2 , j + 1 ) (i-2,j+1) (i−2,j+1), ( i − 2 , j − 1 ) (i-2,j-1) (i−2,j−1), ( i − 1 , j + 2 ) (i-1,j+2) (i−1,j+2), ( i − 1 , j − 2 ) (i-1,j-2) (i−1,j−2), ( i + 1 , j + 2 ) (i+1,j+2) (i+1,j+2), ( i + 1 , j − 2 ) (i+1,j-2) (i+1,j−2), ( i + 2 , j + 1 ) (i+2,j+1) (i+2,j+1), ( i + 2 , j − 1 ) (i+2,j-1) (i+2,j−1) 八个位置。
将军抽车是中国象棋中常用的进攻策略。如下图所示,此时红帅在 ( 1 , 5 ) (1,5) (1,5),红车在 ( 2 , 8 ) (2,8) (2,8)。若黑马跳到红框位置所指的 ( 3 , 6 ) (3,6) (3,6),帅将由于被将军被迫移动,此时,马就可以吃掉红车。
本题将解决将军抽车的简化版问题。在本题中,将军抽车就是要通过一步跳马,在能够将军的同时将车置于马的攻击位置。
只考虑棋盘上有红帅、红车、黑马各一枚的情况,不考虑帅是否可以通过移动实现对车的保护,不考虑别马腿,在当前局面,轮到黑棋移动时,黑马是否可以通过一步移动,在不出界的情况下,实现将军抽车?
输入格式
输入共三行。
输入的第一行为两个整数 S x , S y S_x,S_y Sx,Sy,表示红帅的位置为 ( S x , S y ) (S_x,S_y) (Sx,Sy)。
输入的第二行为两个整数 C x , C y C_x,C_y Cx,Cy,表示红车的位置为 ( C x , C y ) (C_x,C_y) (Cx,Cy)。
输入的第三行为两个整数 M x , M y M_x,M_y Mx,My,表示黑马的位置为 ( M x , M y ) (M_x,M_y) (Mx,My)。
保证红帅在 1 ∼ 3 1 \sim 3 1∼3 行的九宫格内。
输出格式
输出一行一个字符串:
- 若可以实现将军抽车,输出
Yes
。 - 若不可以实现将军抽车,输出
No
。
样例 #1
样例输入 #1
1 5
2 8
5 5
样例输出 #1
Yes
样例 #2
样例输入 #2
1 5
2 9
5 5
样例输出 #2
No
提示说明
数据规模与约定
对于 100 % 100\% 100% 的测试数据, 1 ≤ S x ≤ 3 1 \le S_x \le 3 1≤Sx≤3, 4 ≤ S y ≤ 6 4 \le S_y \le 6 4≤Sy≤6, 1 ≤ C x , M x ≤ 10 1 \le C_x,M_x \le 10 1≤Cx,Mx≤10, 1 ≤ C y , M y ≤ 9 1 \le C_y,M_y \le 9 1≤Cy,My≤9。保证没有任意两枚棋子初始时处于同一位置。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dx[9]={0,-2,-2,-1,-1,1,1,2,2};
ll dy[9]={0,1,-1,2,-2,2,-2,1,-1};
int main()
{
ll sx,sy;
cin>>sx>>sy;
ll cx,cy;
cin>>cx>>cy;
ll mx,my;
cin>>mx>>my;
ll res=0;
for(ll i=1;i<=8;i++)
{
ll x,y;
x=mx+dx[i];
y=my+dy[i];
if(x>=1&&y>=1&&x<=9&&y<=9)
{
if(x!=sx&&y!=sy&&x!=cx&&y!=cy)
{
if(abs(x-sx)+abs(y-sy)==3)
{
if(abs(x-cx)+abs(y-cy)==3)
res=1;
}
}
}
}
if(!res)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
return 0;
}