SGU 147.Black-white king
时间限制:0.25s
空间限制:4M
题意:
在一个N*N(N <= 106)的棋盘上,有三个棋子:黑王、白王、黑白王,它们的行走方式一致,每秒向8个方向中的任意一个行走一步.
现在黑王和白王想要相遇(即占据相邻的格子),而黑白王需要阻止它们相遇,即抓住其中一个王(走到其中一个王所在的格子),
黑王和白王行走时总是走最短路径,而黑白王走的路径无法被缩短(即能够走斜向的时候,不会走Z字形),由于黑白王是隐身的,
所以黑王和白王无法看见黑白王的走向,但是他们知道有它存在,当黑王和白王走到黑白王所在的格子时不会有任何事情发生。
问黑白王是否有可能抓住其中一个王,如果有可能,输出最少步数;如果不可能,输出黑王和白王相遇总共的行走步数。行走顺序为白王、黑王、黑白王。
题解:
如果黑王和白王的y方向差值小于x方向差值,那么将三个棋子的x和y值分别交换。保证黑王和白王的y方向差值大于等于x方向差值,由于黑王和白王总是走他们能够相遇的最短路径,所以每次移动一定要保证在y方向朝对方移动一格,所以两个王的行走区域为朝着对方方向的一个“喇叭”形区域。
如图2所示,两个王的y方向坐标差值为T,黑王坐标(Bx, By),白王坐标(Wx, Wy),那么走i步后的黑王的y方向坐标为定值By + i * bDir,其中bDir为黑王到白王的方向;x方向的可行区间为[Bx – i, Bx + i]和[Wx – (T-i), Wx + (T-i)]的区间交集,即图中两个“喇叭”形区域的交集就是黑王和白王的可行区域,最多T-1步后两人相遇。
图4
黑白王的运动区域更加简单,如图3所示,灰色的方形外框表示经过3步后黑白王有可能在的位置,即一个长度为2i + 1的空心正方形区域。
图5
于是,可以枚举步数,判断黑王和黑白王、白王和黑白王的第i步的区间区域是否有交集,如果一旦出现某个王在第i步的时候和黑白王的正方形区域有交集,则表明黑白王有可能在第i步抓住其中一个王,否则当2i >= T-1的时候还没有交集,表明黑王和白王已经相遇,总步数为T-1。总复杂度O(N)。
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int n, d, st, ans;
struct Point
{
int x, y;
Point() {}
Point (int x, int y) : x (x), y (y) {}
void scan() { scanf ("%d%d", &x, &y); }
void print() { printf ("%d %d\n", x, y); }
};
Point b, w, bw, bl, br, wl, wr;
char res[2][5] = {"NO", "YES"};
int dis (Point a, Point b)
{
return max (abs (a.x - b.x), abs (a.y - b.y) );
}
int fail (Point k)
{
int d0 = dis (bw, Point (k.x, k.y) );
if (d0 > st) return 1;
else if (d0 < st) return -1;
return 0;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen ("data.in", "r", stdin);
#endif
scanf ("%d", &n);
b.scan(), w.scan(), bw.scan();
if (abs (b.x - w.x) > abs (b.y - w.y) ) swap (b.x, b.y), swap (w.x, w.y), swap (bw.x, bw.y);
if (b.y < w.y) swap (b, w);
d = dis (b, w) - 1;
bl = br = b, wl = wr = w;
//b.print(),w.print(),bw.print(),printf("\n");
for (st = 0; st < (d + 1) / 2 && fail (bl) *fail (br) > 0 && fail (wl) *fail (wr) > 0; st++)
{
if (bl.x > 1 && w.x - bl.x + 1 < bl.y - w.y) bl.x--;
else if (w.x - bl.x + 1 > bl.y - w.y) bl.x++;
if (br.x < n && br.x - w.x + 1 < br.y - w.y) br.x++;
else if (br.x - w.x + 1 > br.y - w.y) br.x--;
bl.y--, br.y--;
if (wl.x > 1 && b.x - wl.x + 1 < b.y - wl.y) wl.x--;
else if (b.x - wl.x + 1 > b.y - wl.y) wl.x++;
if (wr.x < n && wr.x - b.x + 1 < b.y - wr.y) wr.x++;
else if (wr.x - b.x + 1 > b.y - wr.y) wr.x--;
wl.y++, wr.y++;
//bl.print(),br.print(),wl.print(),wr.print();
}
ans = (st < (d + 1) / 2);
printf ("%s\n%d\n", res[ans], ans ? st : d);
return 0;
}
SGU 147.Black-white king的更多相关文章
- sgu 147. Black-white king 思路 坑 难度:1
147. Black-white king time limit per test: 0.25 sec.memory limit per test: 4096 KB input: standard i ...
- SGU 246. Black & White(数论)
题意: 有2*n-1个黑色和白色的珠子组成的环形项链,求至少需要多少颗黑色珠子才能使任意排列的项链中都存在两个黑珠间有n个珠子. (2*n-1<=2^31-1); Solution: 先分析n= ...
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) A. The King's Race
http://codeforces.com/contest/1075/problem/A On a chessboard with a width of nn and a height of nn, ...
- 【leetcode】1222. Queens That Can Attack the King
题目如下: On an 8x8 chessboard, there can be multiple Black Queens and one White King. Given an array of ...
- 【LeetCode】1222. Queens That Can Attack the King 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...
- [SQL Server] 特殊字符、上标、下标处理
今天遇到一个问题是往 SQL Server 中导入像m².m³这样的单位数据,可是在 SQL Server 中查看到的都是 m2.m3,于是在网上查了一下资料,顺便摘录下来供日后查阅. 一 Wind ...
- Codeforces Round #379 (Div. 2) A B C D 水 二分 模拟
A. Anton and Danik time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Codeforces Round #379 (Div. 2) 总结分享
前言 初入acm的新手,打算在cf混.这几天没有比赛,就做了个最新的Virtual participation.虽然说div2比较简单,但还是被虐得体无完肤...Orz.两个小时,共6道题.最后只AC ...
- Codeforces Round #379 (Div. 2) D. Anton and Chess 水题
D. Anton and Chess 题目连接: http://codeforces.com/contest/734/problem/D Description Anton likes to play ...
随机推荐
- Mysql分页查询
取前5条数据 select * from table_name limit 0,5 或 select * from table_name limit 5 取第11条到第15条数据,共5条 select ...
- bzoj3275
容易想到是最小割(最大权独立集)然后每个数拆成两个点,不能同时选的之间连边跑最小割,最后答案=总数-mincut/2 因为这样建图将流量变成了原来的两倍 当然这道题更好的建图方法是分成奇数和偶数两个集 ...
- 「Poetize5」Vani和Cl2捉迷藏
描述 Description 这片树林里有N座房子,M条有向道路,组成了一张有向无环图.树林里的树非常茂密,足以遮挡视线,但是沿着道路望去,却是视野开阔.如果从房子A沿着路走下去能够到达B,那么在A和 ...
- ActionFilterAttribute OnActionExecuting 获取参数
public class AuthFilterAttribute : ActionFilterAttribute { /// <summary> /// Action执行前处理 /// & ...
- 十大纺织品、布料、面料品牌排名 - 十大品牌 - 中国品牌网 Chinapp.com
十大纺织品.布料.面料品牌排名 - 十大品牌 - 中国品牌网 Chinapp.com 十大纺织品.布料.面料品牌排名
- Storm-1.0.1+ZooKeeper-3.4.8+Netty-4.1.3 HA集群安装
Storm-1.0.1+ZooKeeper-3.4.8+Netty-4.1.3 HA集群安装 下载Storm-1.0.1 http://mirrors.tuna.tsinghua.edu.cn/apa ...
- Keywords Search - HDU 2222(AC自动机模板)
题目大意:输入几个子串,然后输入一个母串,问在母串里面包含几个子串. 分析:刚学习的AC自动机,据说这是个最基础的模板题,所以也是用了最基本的写法来完成的,当然也借鉴了别人的代码思想,确实是个很神 ...
- linux网络编程echo多进程服务器
echo_server 多进程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #incl ...
- [转载]Android利用convertView优化ListView性能
本的getView写法 Java代码public View getView(int position, View convertView, ViewGroup parent) {View view = ...
- 账户管理命令 useradd、groupadd
内容提要: 1. 掌握用户的 增/删/改 命令 2. 掌握组的 增/删/改 命令 组管理 1)groupadd groupadd 用于添加组账号.格式如下: groupadd [-g GID] GRO ...