C1671 [Wannafly冬令营2018Day4]小小马(思维)

题目描述

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的棋盘一定能够走到任意一点。而且每走一次格子的颜色就变一次。
3
3的棋盘只要不在(2,2)就可以
2m的棋盘,只要不在一行,那么列的坐标差是2的倍数即可。
2
n的棋盘一样。

#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;
}

发布了594 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tomjobs/article/details/103532007