有一个 N × N 的方形网状网格线,如下图所示。网格的节点位于点 (X, Y),其中 X 和 Y 是从 0 到 N-1 的整数。电流流过电网,在 (0, 0) 和 (N-1, N-1) 的节点之间。
最初,所有电线都传导电流,但电线以每秒一根的速度烧毁。烧坏由三个零索引的整数数组 A、B 和 C 来描述,每个数组的大小为 M。对于每个时刻 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
烧坏了。您可以假设这些数组描述了现有的电线,并且没有电线烧毁超过一次。你的任务是确定电流何时停止在 (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) 处的节点之间没有连接。这种情况如下图所示:
给定 N = 4、M = 1 和以下数组:
A[0] = 0 B [0] = 0 C[0] = 0
您的函数应该返回 -1,因为烧断单根线不会破坏 (0, 0) 和 (N-1, N-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).