次の図に示すように、N×Nの正方形のメッシュ型のワイヤーグリッドがあります。グリッドのノードはポイント(X、Y)にあり、XとYは0からN-1までの整数です。電流は、(0、0)と(N-1、N-1)のノード間でグリッドを流れます。
最初は、すべてのワイヤーが電流を流しますが、ワイヤーは1秒に1回の割合で燃え尽きます。バーンアウトは、それぞれサイズMの整数の3つのゼロインデックス配列A、B、およびCによって記述されます。各瞬間T(0≤T<M)について、T番目の秒でノード間のワイヤ(A [T ]、B [T])および:
(A[T], B[T] + 1), if C[T] = 0 or
(A[T] + 1, B[T]), if C[T] = 1
燃え尽きる。アレイが既存のワイヤを記述し、ワイヤが2回以上燃え尽きることはないと想定できます。あなたの仕事は、電流が(0,0)と(N-1、N-1)のノード間を流れるのをいつ停止するかを決定することです。
関数を書く:
int wire_burnouts(int N, int A[], int M, int B[], int M2, int C[], int M3);
つまり、整数Nと配列A、B、Cが与えられると、(0、0)と(N-1、N-1)のノード間で電流が流れなくなるまでの秒数が返されます。すべてのMワイヤが切れた後も電流が流れ続ける場合、関数は-1を返す必要があります。
たとえば、N = 4、M = 9、および次の配列が与えられた場合:
A [0] = 0 B [0] = 0 C [0] = 0
A 1 = 1 B 1 = 1 C 1 = 1
A 2 = 1 B 2 = 1 C 2 = 0
A [3] = 2 B [ 3] = 1 C [3] = 0
A [4] = 3 B [4] = 2 C [4] = 0
A [5] = 2 B [5] = 2 C [5] = 1
A [6] = 1 B [6] = 3 C [6] = 1
A [7] = 0 B [7] = 1 C [7] = 0
A [8] = 0 B [8] = 0 C [8] = 1
8番目のワイヤが切れた直後は、(0、0)と(N-1、N-1)のノード間に接続がないため、関数は8を返すはずです。この状況を次の図に示します。
N = 4、M = 1、および次の配列が与えられます。
A [0] = 0 B [0] = 0 C [0] = 0
1本のワイヤーを焼き尽くしても(0、0)と(N-1、N-1)のノード間の接続を切断できないため、関数は-1を返す必要があります。
と仮定する:
N is an integer within the range [1..400];
M is an integer within the range [0..2*N*(N−1)];
each element of array A is an integer within the range [0..N−1];
each element of array B is an integer within the range [0..N−1];
each element of array C is an integer within the range [0..1].
複雑:
expected worst-case time complexity is O(N2*log(N));
expected worst-case space complexity is O(N2), beyond input storage (not counting the storage required for input arguments).