题目大意:给出一个n*n的跳棋棋盘,棋盘上有三个跳棋,被摆成L型且彼此相邻,给出一个点的坐标,问能否有跳棋到达该点,
思路:首先,L型的棋子肯定可以走遍两个棋子所在的一整个横行或一整个竖列,然后在同一行的两个棋子移动一个后,另一个棋子可以斜向移动,这样就成了一个与之前L的拐点对称的L,之后我们不难发现,通过这样的方式,棋子可以走遍每个以L型拐点为中心的九宫格的中间十字,下图中有五角星的格子即为左上三个棋子能到达的所有格子。特别的是,如果L的拐点恰好在棋盘的一角,因为不能斜向走,所以只能走到拐点所在的那一行或那一列
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n, x1 = 0, y1 = 0;
scanf("%d", &n);
int tempx, tempy;
scanf("%d%d", &tempx, &tempy);
bool flagx = 0, flagy = 0;
for (int i = 1; i <= 2; i++)
{//找出L的拐点,横坐标出现两次,纵坐标出现两次的点就是拐点
int x, y;
scanf("%d %d", &x, &y);
if (x==tempx)
{
x1 =x;
flagx = 1;
}
if (i == 2 && flagx == 0)
{
x1 = x;
}
if (y == tempy)
{
y1 = y;
flagy = 1;
}
if (i == 2 && flagy == 0)
{
y1 = y;
}
}
int x, y;
scanf("%d %d", &x, &y);
if ((x1 == 1 && (y1 == 1 || y1 == n)) || (x1 == n && (y1 == n || y1 == 1)))
{//拐点是否在墙角
if (x == x1 || y == y1)
{//拐点在墙角只能走那一行或那一列
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
else
{
if (x % 2 != x1 % 2 && y % 2 != y1 % 2)
{//检查询问的点是否在以拐点为中心的十字上
cout << "NO" << endl;
}
else
{
cout << "YES" << endl;
}
}
}
return 0;
}