다음과 같은 행렬이 있다고 가정하십시오.
11111
12221
12321
12221
11111
이 행렬은 지형을 나타내고 각 셀은 지형의 일부를 나타냅니다. 각 셀의 숫자는 가연성 에 따라 지형의 일부를 완전히 태워야하는 시간 (측정 단위가 필요한 경우 몇 분)을 나타 냅니다. 특정 위치 (셀)에서 화재가 시작되면 화재가 인접한 셀로 전파되기 전에 해당 셀을 완전히 태워야합니다 (대각선이 아닌 가로 및 세로 만). 따라서 화재가 중앙 위치에서 시작되면 화재가 필요합니다.
11111 11111 11111 11011 10001 00000
12221 3 m. 12221 2 m. 12021 1 m. 11011 1 m. 00000 1 m. 00000
12321 -----> 12021 -----> 10001 -----> 00000 -----> 00000 -----> 00000
12221 12221 12021 11011 00000 00000
11111 11111 11111 11011 10001 00000
설명:
- 화재는 [2,2] (0 기반)에서 시작하며 굽기 시간은 3입니다.
- 3 분 후 [1,2], [2,1], [2,3], [3,2]가 타기 시작합니다.
- 2 분 후, 해당 세포는 연소를 끝내고 화재가 모든 인접 세포로 전파되지만 [0,2], [2,0], [2,4], [0,4]는 1 분만 더 연소하면되므로
- 1 분 후, 이들 세포는 태워지고 세포는 인접한 세포로 전파된다.
- 1 분 후에 3 단계의 나머지 셀이 레코딩을 종료하고 화재가 인접한 셀로 전파됩니다 (이미 레코딩 된 상태이므로 아무 일도 일어나지 않습니다).
- 마지막 1 분 후, 화재가 전체 지형을 태워 종료합니다.
따라서이 경우의 해결책은 8 분입니다. 맨 왼쪽 셀 [0,0]에서 화재가 시작되는 경우 :
11111 01111 00111 00011 00001 00000
12221 1 12221 1 02221 1 01221 1 00121 1 00011 1
12321 --> 12321 --> 12321 --> 02321 --> 01321 --> 00321 -->
12221 12221 12221 12221 02221 01221
11111 11111 11111 11111 11111 01111
00000 00000 00000 00000 00000
00000 1 00000 1 00000 1 00000 1 00000
00221 --> 00110 --> 00000 --> 00000 --> 00000
00221 00121 00020 00010 00000
00111 00011 00001 00000 00000
이제 총 시간은 10 분입니다.
도전
모든 셀이 완전히 소비되어야하는 시간을 나타내는 NxM 행렬 (N> 0, M> 0)의 정수 값이 주어지면 해당 행렬과 발사가 시작되는 위치를 갖는 정수 쌍을 취하는 가장 짧은 프로그램 / 함수를 작성하십시오 화재가 전체 지형을 완전히 소비하는 데 필요한 시간을 반환 / 인쇄합니다.
- 모든 셀에는 0이 아닌 양의 레코딩 시간이 있습니다. 셀의 최대 값을 가정 할 수 없습니다.
- 행렬은 정사각형이나 대칭 일 필요는 없습니다.
- 매트릭스는 원하는대로 0 인덱스 또는 1 인덱스가 될 수 있습니다.
- 위치는 정수의 튜플을 가진 단일 매개 변수, 다른 적절한 형식의 두 개의 개별 매개 변수로 제공 될 수 있습니다.
- 행렬의 차원은 입력 매개 변수로 지정할 수 없습니다.
- 요청한 시간 만 모든 중간 단계를 출력 할 필요는 없습니다. 그러나 단계가 어떤 식 으로든 시각화되어 있는지 불평하지 않습니다.
또 다른 예:
Fire starts at [1,1] (a '>' represents a minute):
4253 4253 4253 4153 4043 3033 2023 0001 0000
2213 > 2113 > 2013 > 1003 > 0002 > 0001 > 0000 >> 0000 > 0000
1211 1211 1211 1111 1001 0000 0000 0000 0000
Output: 9
이것은 code-golf 이므로 각 언어마다 가장 짧은 프로그램이 이길 수 있습니다!
1
까지M*N