流星群
リンク:https://ac.nowcoder.com/acm/contest/997/I
出典:牛オフネットワーク
制限時間:C / C ++ 1秒、2秒言語は、他の
スペースの制限:C / C ++ 32768K、他の言語は65536kも
64ビットIOフォーマット:LLD%
スペースの制限:C / C ++ 32768K、他の言語は65536kも
64ビットIOフォーマット:LLD%
タイトル説明
ベッシーは、異常な流星群が来ていることを聞きます。報告書は、これらの流星が地球に衝突し、彼らはヒット何かを破壊することを言います。彼女の安全のために不安、彼女は安全な場所(流星によって破壊されることはありません1)に彼女の方法を見つけることを誓います。彼女は現在座標平面の原点で放牧し、彼女の道に沿って流星によって破壊されて回避しながら、新たな、より安全な場所に移動したいと考えています。
時間Ti(チタン≤千≤0)で、報告書は、M流星(50,000≤1≤M)は流星iはポイント(西、李)(0≤李≤300 0≤Xiの≤300)を打つだろうと、打つだろうと言います。各流星は、それが、4つの直線的に隣接する格子点に当たる点を破壊します。
ベッシーは、時間0で原点を出てまだ流星によって破壊されない(しばしば4)に隣接する直線状の点のいずれかに毎秒1つの距離単位の速度で軸に第一象限と平行に移動することができます。彼女は、それが破壊された時)以上の任意の時間の点に配置することができません。
それは安全な場所に到達するためにベッシーを要する最小時間を決定します。
時間Ti(チタン≤千≤0)で、報告書は、M流星(50,000≤1≤M)は流星iはポイント(西、李)(0≤李≤300 0≤Xiの≤300)を打つだろうと、打つだろうと言います。各流星は、それが、4つの直線的に隣接する格子点に当たる点を破壊します。
ベッシーは、時間0で原点を出てまだ流星によって破壊されない(しばしば4)に隣接する直線状の点のいずれかに毎秒1つの距離単位の速度で軸に第一象限と平行に移動することができます。彼女は、それが破壊された時)以上の任意の時間の点に配置することができません。
それは安全な場所に到達するためにベッシーを要する最小時間を決定します。
説明を入力します。
* 1行目:単一の整数:M
*行2..M + 1:西、李、およびTi:i線+ 1は3スペースで区切られた整数が含まれています
出力説明:
* 1行目:それは不可能であるならば、それは安全な場所に到達するためにベッシーを取るか、-1最小時間。
例1
説明
T = 5で上記プロットを調べ、最も近い安全な点は(3,0)である-しかし、その時点までベッシーのパスがあまりにも速く第流星によって遮断されます。次の最も近い点は(4,0)である-あまりにもすぐにブロックされました。(0,5)上の格子点である次の最も近い後- (5,0)対角線。これらのうち、任意の一つ(0,5)、(1,4)、および(2,3)は5 timeunitsに到達可能です。
5 |。。。。。。。
4 |。。。。。。。
3 | 3 4 5。。。。時間をかけてベッシーの場所
2 | 2。。。。。。一つの解決策のための
1 | 1。。。。。。
0 | 0。。。。。。
--------------
0 1 2 3 4 5 6
一直在想动态标记、结果...巧妙的地図让人折服
#include <cmath> の#include <アルゴリズム> の#include <iostreamの> する#include <アルゴリズム> の#include <iostreamの> する#include <cstdioを> する#include < ストリング > の#include <CStringの> する#include <stdio.hに> する#include < セット > の#include <スタック> の#include < 文字列・H> の#include <ベクトル> の#include <キュー> #defineする MEを(X、Y)のmemset(X、Y、はsizeof(X)) の#define SF(N)のscanf ( "%d個"、& N) の#define担当者(I、n)はのために(iは++; iがn <I = 0 INT) の#define 0x3f3f3f3f INFを 使用して、 名前空間STDを、 const int型 N = 509 ; int型の C [N]、D [N]。 int型 VIS [ 309 ] [ 309 ]、マップ[ 309 ] [ 309 ]。 INTの DIR [ 4 ] [ 2 ] = {{ 1、0 }、{ - 1、0 }、{ 0、1 }、{ 0、 - 1 }}。 構造体ノード{ INTX、Y、T。 ノード(INT X = 0は、int型、Y = 0、INT T = 0 ) { この - > X = X。 この - > Y = Y。 この - > T = T; } }。 INT BFS(int型のx、int型のY) { キュー <ノード> S。 構造体の次のノード。 s.push(ノード(X、Y、0 )); VIS [X] [Y] = 1 。 同時に(!s.empty()) { 次 = s.front()。 s.pop(); もし([next.x] [next.y] ==マップ1009 ) { 返すnext.t。 } のために(int型 i = 0 ; iは< 4 ; iは++ ) { int型 XX = next.x + DIR [I] [ 0 ]。 INT YY = next.y + DIR [I] [ 1 ]。 int型 TT = next.t + 1 ; もし(!VIS [XX] [YY] && XX> = 0 && YY> =0 && TT < マップ[XX] [YY]) { VIS [XX] [YY] = 1 。 s.push(ノード(XX、YY、TT))。 } } } リターン - 1 。 } int型のmain() { int型N; 一方、(scanf関数(" %のD "、&N)=!EOF) { ため(int型 iは= 0 ; I < 309 ; iは++ ) { ため(INT J = 0; J < 309 ; J ++ ) { マップ[I] [J] = 1009 。 } } のために(int型 i = 0 ; iがn <I ++の) { int型のx、y、Tを、 scanf関数(" %D%D%D "、およびX&Y、&T)。 地図[X] [Y]は = 分(地図[X] [Y]、t)を。 用(INT J = 0 ; J < 4 ; J ++ ) { int型 XX = X + DIR [J] [0 ]。 INT YY = Y + DIR [J] [ 1 ]。 もし(XX> = 0 && YY> = 0 ) 地図[XX] [YY] = 分(地図[XX] [YY]、T); } } COUT << BFS(0、0)<< ENDL。 } 戻り 0 。 }