宫涵蕴和大奶牛的手办
1000ms
守序善良宫涵蕴嫌弃混乱邪恶大奶牛天天玩塑料小人不写代码,把大奶牛的手办全扔了,结果把大奶牛气死了,死后的大奶牛附身到了宫涵蕴身上,和宫涵蕴的灵魂轮流控制身体,夺回身体的唯一方案是在宫涵蕴的身体在宫涵韵意识的控制下下触碰到被扔弃的手办。
当前宫涵蕴在坐标轴上,她的位置和手办的位置保证是整数,她可达的所有点为
{(i,j) | 0 ≤ i, j ≤ n - 1, i j为整数},
宫涵蕴和大奶牛的灵魂每秒交换一次身体控制权限,大奶牛控制身体的时候,每秒能任意往上下左右四个方向前进1,轮到宫涵蕴控制身体的时候,每秒只能往当前朝向的斜对角,即左前方和右前方前进√2 。地图上会有障碍物,由于大奶牛是死人,所以当他控制身体时,既不会受到障碍物和脚印的限制,也不会留下脚印,而宫涵蕴不能跨越障碍物,同时每一步都会留下脚印,她也会拒绝往有脚印的地方行动。无论是谁控制身体,都不能越过边界。
初始情况下均由大奶牛占据身体。请判断宫涵蕴最后能否夺回身体。
Input
第一行为一个正整数T (T ≤ 15),表示测试用例的数量。
对于每个测试用例:
第一行为空格隔开的两个整数 n,m (1 ≤ n, m ≤ 50),分别为范围和障碍物的数量。
第二行为空格隔开的四个整数x1,y1, x2, y2 (0 ≤ x1, y1, x2, y2 ≤ n - 1),为宫涵蕴躯体所在的起点横坐标,纵坐标以及被丢弃的玩具所在的横坐标,纵坐标。
接下来 m 行,每行两个数字,分别代表第 i 个障碍所在的横坐标和纵坐标。
Output
如果有可能夺回身体,输出Yes。
如果不能,输出No。
SampleInput
1
4 3
3 2 1 3
1 1
3 1
3 3
SampleOutput
Yes
Note
对于样例, 大奶牛控制身体(3, 2) ->(2, 2)
宫涵蕴控制身体(2, 2) -> (1, 3)
当大奶牛控制身体从(3, 2)移动到(2, 2)时,轮到宫涵蕴控制身体,她只能前往(1, 3)或者(1, 1)。
恩原创题
开心
因为大奶牛的移动不受任何限制也不会留下任何痕迹,所以题目就转化成日字形的移动
int xx[10] = {-2, -2, -1, -1, 1, 1, 2, 2};
int yy[10] = {-1, 1, -2, 2, -2, 2, -1, 1};
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
struct Node
{
int x;
int y;
};
int vis[N][N];
int bx, by;
int ex, ey;
int n, m;
int xx[10] = {-2, -2, -1, -1, 1, 1, 2, 2};
int yy[10] = {-1, 1, -2, 2, -2, 2, -1, 1};
bool check(Node node)
{
int x = node.x;
int y = node.y;
if(x < 0 || x >= n) return false;
if(y < 0 || y >= n) return false;
if(vis[x][y]) return false;
return true;
}
bool bfs()
{
Node now;
Node ne;
queue<Node> Q;
now.x = bx;
now.y = by;
vis[bx][by] ++;
Q.push(now);
while(!Q.empty()){
now = Q.front();
Q.pop();
//printf("%d %d\n", now.x, now.y);
if(now.x == ex && now.y == ey) return true;
for(int i = 0; i < 8; i ++){
ne.x = now.x + xx[i];
ne.y = now.y + yy[i];
if(check(ne)){
vis[ne.x][ne.y] = 1;
Q.push(ne);
}
}
}
return false;
}
int main(int argc, char const *argv[])
{
int ncase;
//freopen("1.in", "r", stdin);
//freopen("1.ans", "w", stdout);
scanf("%d", &ncase);
while(ncase --){
scanf("%d%d", &n, &m);
memset(vis, 0, sizeof(vis));
scanf("%d%d%d%d", &bx, &by, &ex, &ey);
for(int i = 0; i < m; i ++){
int x, y;
scanf("%d%d", &x, &y);
vis[x][y] = 1;
}
if(bfs()){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return 0;
}