方法:バイナリの答え+ DFS
バイナリ半ばには、決意条件DFS、バイナリ、更新として、最も大きな被害を殺すために。
あなたは半ばより小さい行くことができるか、行かない、この格子損傷の現在のコストは、最後の行だけに最初から歩いて、各チェック機能が可能かどうかを判断する場合の答えの私たちの半ば半分は、境界を示すために、各ラインなぜなら各ドアはに行くことに限り1ように、我々は送信、接続された他のM-1過去にこの道に沿って、個人、その後、過去数千万人の横のドアに沿って、被害の最初と最後の行理由ゼロの値は、そのMoが問題だったん。
Q:
なぜ、あなたは彼が損傷今回の事の最大値を表すためにのために、私たちは見ていない時は、DFSかどうかを判断することができます限り、到達することができますか?
回答:
(私たちは二分法を重視するので、最後の二つの点から必ずしも私たちの最終的な答えで生成されたポイントの価値を傷つけることは半ばがあるので、この点は、彼は半ばよりも小さいか否かを判断することが可能ですされているかどうか、最大まあです最大値は答えである)我々はそれが出力でき境界の質問の最後の二点のダメージの半分の値である理由これも説明しています。
// たびDFSのチェック値 //を限りマップとして[i] [j]が値よりも小さい場合は、MIDが行くことができます 。// それ以外の場合は行くことができない// 二分答え // 旗記録する際に、各チェックを // すべての旗を一度クリア // 現在のチェックが最後の行に到達することができた場合は 、// フラグがtrueを表す場合でも、 // フラグがtrueの場合、説明を達することが // 二分答えを継続 する#include <cstdioを> する#include <CStringの> する#include <iostreamの> 使用して 名前空間STDと、 のconst int型 N = 1010 ; INT N-、M、マップ[N] [N]、L、R&LT、MID、X、Y、 INT [DXの4 ] = { - 1、1。、0、0 }、DY [ 4 ] = { 0、0、 - 1、1 }。 ブールフラグ= 0 、VIS [N] [N]。 int型読み取り(){ int型、S = 0、W = 1 。 チャー CH = GETCHAR()。 一方、(!isdigit(CH)){ 場合(CH == ' - ')W = - 1 ; CH = GETCHAR();} ながら(isdigit(CH)){S = sの* 10 + CH - ' 0 '; CH = GETCHAR();} 戻り S * W。 } ボイド DFS(INT XX、INT YY){ 場合(XX == N){フラグ= 1。返す;} ため(int型 i = 0 ; iは< 4 ; I ++ ){ X = XX + DX [i]は、Yは= YY +のDYの【をI]。 もし(X> = 1 && X <= N && Y> = 1つの && Y <= M &&マップ[X] [Y] <=ミッド&&!VIS [X] [Y]){ VIS [X] [Y] = 1 ; DFS(X、Y) VIS [X] [Y]= 0 ; もし(フラグ)ブレーク。 } } } ブールチェック(INT X){ フラグ = 0 。 memsetの(VIS、0、はsizeof (VIS))。 DFS(1、1 )。 もし(フラグ)リターン 1 。 リターン 0 ; } int型のmain(){ N =(読み取り)、M = read()は、 以下のための(int型 I = 1; I <= N。I ++ ) のための(INT J = 1 ; J <= Mであり、j ++ ) [I] [j]がマップ)(読み取り= R = MAX(R、マップ[I] [J])。 一方、(L + 1 < R){ 半ば =(L + R)>> 1 。 もし(チェック(MID))、R = ミッド; 他リットル= ミッド; } のprintf(" %d個の\ n " 、R)。 リターン 0 ; }
私は健康を願って、見ていただきありがとうございます!