[BOJ 1387] 행렬 교환

View as PDF

Submit solution

Points: 4
Time limit: 2.0s
Memory limit: 128M

Problem types
Allowed languages
Assembly, Awk, C, C++, Java, Pascal, Perl, Python, Sed, Text

0과 1로만 이루어져 있는 크기가 N×M인 행렬 A와 B가 주어진다. 교환 연산을 이용해 행렬 A를 B로 바꾸는 최소 연산 횟수을 구하려고 한다. 교환 연산은 행렬 A에서 가로, 세로, 대각선으로 인접한 두 칸을 고르고, 그 값을 서로 교환하는 것이다. 단, 행렬 A의 (i, j)은 최대 Ci,j번 교환 연산에 사용될 수 있다.

입력 형식

첫째 줄에 행렬의 크기 N, M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A 정보가 한 줄에 하나씩 주어진다. i번째 줄의 j번째 정수는 행렬 A의 (i, j)에 있는 수 Ai,j를 의미한다. 한 행의 정보는 공백없이 주어진다. 다음 N개의 줄에는 행렬 B의 정보, 그 다음에는 C의 정보가 행렬 A가 주어진 형식과 같게 주어진다.

출력 형식

첫째 줄에 행렬 A를 B로 만들기 위한 최소 연산 횟수를 출력한다. 만약, A를 B로 바꿀 수 없다면 -1을 출력한다.

예제 입력 1

3 3
110
000
001
000
110
100
222
222
222

예제 출력 1

4

예제 입력 2

1 2
10
01
11

예제 출력 2

1

예제 입력 3

3 3
111
000
111
111
000
111
013
537
136

예제 출력 3

0

예제 입력 4

2 3
001
110
000
111
000
111

예제 출력 4

-1

예제 입력 5

2 3
100
000
000
000
999
999

예제 출력 5

-1

예제 입력 6

5 6
011101
110000
000011
000000
100000
110100
000011
000000
110001
000010
305713
537211
352421
242212
333313

예제 출력 6

10

예제 입력 7

2 2
10
00
00
01
11
11

예제 출력 7

1

Comments

There are no comments at the moment.