题目描述
wlswls 有一张 nn 行 mm 列的国际象棋棋盘,上面有一匹马。
现在 wlswls 想知道存不存在一条从起点到终点的路径,使得经过的白点和黑点一样多(起点和终点也会计算在内)?
马只能走马步,假设马现在在 (x,y)(x,y) 上,它只能跳到 (x-2,y-1)(x−2,y−1), (x-2,y+1)(x−2,y+1), (x-1,y-2)(x−1,y−2), (x-1,y+2)(x−1,y+2), (x+1,y-2)(x+1,y−2), (x+1,y+2)(x+1,y+2), (x+2,y-1)(x+2,y−1), (x+2,y+1)(x+2,y+1) 八个格子。
无论什么时候,马都不能跳出棋盘。
对于点 (x,y)(x,y),如果 xyxy 的奇偶性相同,则为黑格,否则为白格。
输入描述
第一行两个整数 nn,mm。
第两行两个整数 SxSx,SySy 表示起点。
第三行两个整数 ExEx,EyEy 表示终点。
2 \leq n, m \leq 10000002≤n,m≤1000000
1 \leq Sx, Ex \leq n1≤Sx,Ex≤n
1 \leq Sy, Ey \leq m1≤Sy,Ey≤m
起点 != 终点
输出描述
如果存在这样的路径,输出 YesYes,否则输出 NoNo。
样例输入 1
10 10
1 1
10 10
样例输出 1
No
思路:
很有意思的一道题目。
起点终点颜色得不同。
大于34的棋盘一定能够走到任意一点。而且每走一次格子的颜色就变一次。
33的棋盘只要不在(2,2)就可以
2m的棋盘,只要不在一行,那么列的坐标差是2的倍数即可。
2n的棋盘一样。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
int n,m;scanf("%d%d",&n,&m);
int sx,sy,ex,ey;scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
int f1 = (sx & 1) == (sy & 1);
int f2 = (ex & 1) == (ey & 1);
int flag = 0;
if(f1 != f2)
{
if(sx == sy && ex == ey)flag = 0;
else if((n >= 3 && m >= 4) || (n >= 4 && m >= 3))flag = 1;
else if(n == 3 && m == 3)
{
if((sx != 2 || sy != 2) && (ex != 2 || ey != 2))flag = 1;
}
else if(n == 2)
{
if(sx != ex && sy != ey && (abs(sy - ey)) % 2 == 0)flag = 1;
}
else if(m == 2)
{
if(sy != ey && sx != ex && (abs(sx - ex)) % 2 == 0)flag = 1;
}
}
if(flag == 0)printf("No\n");
else printf("Yes\n");
return 0;
}