1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import numpy as np

def generate_moves(n, m, plansza):
    # częstotliwości kolorów w rzędach i kolumnach:
    # utwórz listę n pustych map:
    czestosci_rzedy = [{} for _ in range(n)]
    czestosci_kolumny = [{} for _ in range(m)]
    # for i in range(n):
    #     #for j in range(m):
    #     czestosci_rzedy[i] = Counter(plansza[i])
    #     j = 0
    #     for zn in plansza[i]:
    #         #zn = plansza[i][j]
    #         # ...

    #         czestosci_kolumny[j][zn] = czestosci_kolumny[j].get(zn, 0) + 1
    #         j += 1

    for i in range(plansza.shape[0]):
        unique, counts = np.unique(plansza[i, :], return_counts=True)
        czestosci_rzedy[i] = dict(zip(unique, counts))

    for i in range(plansza.shape[1]):
        unique, counts = np.unique(plansza[:, i], return_counts=True)
        czestosci_kolumny[i] = dict(zip(unique, counts))

#    return 0, []

    n_max = n
    m_max = m
    # 2. Inicjalizuj listę ruchów
    ruchy = []

    while n_max > 0 and m_max > 0:        
        if len(czestosci_rzedy) > 0 and m_max > 0:
            rzedy_do_usuniecia = []
            kolory_do_zmniejszenia = {}
            for i in range(n):
                for x in czestosci_rzedy[i].items():
                    if x[1] == m_max:
                        n_max -= 1
                        ruchy.append(f'R {i+1} {x[0]}')
                        rzedy_do_usuniecia.append(i)
                        kolory_do_zmniejszenia[x[0]] = kolory_do_zmniejszenia.get(x[0], 0) + 1
            for j in range(m):
                if len(czestosci_kolumny[j]) > 0:
                    for kol_cz in kolory_do_zmniejszenia.items():
                        if kol_cz[0] in czestosci_kolumny[j]:
                            czestosci_kolumny[j][kol_cz[0]] -= kol_cz[1]
                            if czestosci_kolumny[j][kol_cz[0]] == 0:
                                del czestosci_kolumny[j][kol_cz[0]]
            for i in rzedy_do_usuniecia:
                czestosci_rzedy[i] = {}

        if len(czestosci_kolumny) > 0 and n_max > 0:
            kolumny_do_usuniecia = []
            for j in range(m):
                for x in czestosci_kolumny[j].items():
                    if x[1] == n_max:
                        m_max -= 1
                        ruchy.append(f'K {j+1} {x[0]}')
                        kolumny_do_usuniecia.append(j)
                        for i in range(n):
                            if len(czestosci_rzedy[i]) > 0:
                                czestosci_rzedy[i][x[0]] -= 1
            for j in kolumny_do_usuniecia:
                czestosci_kolumny[j] = {}

    ruchy.reverse()
    return len(ruchy), ruchy

# 1. Wczytaj dane
n, m = map(int, input().split())
p0 = np.array([input() for _ in range(n)])
plansza = np.array([list(s) for s in p0])

moves_count, moves = generate_moves(n, m, plansza)
print(moves_count)
for move in moves:
    print(move)