본문 바로가기
Computer Science

행렬찾기 / 소트

by OKOK 2018. 12. 19.

1. 매트릭스 체크해서 숫자가 있는지 파악함

2. 디버깅 쉽게 하기 위함인가

3. 지나간 자리는 0으로 만들기 이것모두 엔제곱으로 푸리

4. 그리고 이때 엑스와 와이를 체크함, 그리고 v를 계산함

5. 마지막에 소팅해서

6. 출력하면 끝 


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
#include<stdio.h>
 
//#define MAX_N (100)
#define MAX_N 5
 
int N;
int V[MAX_N][MAX_N];
 
#define MAX_SUB (20)
typedef struct {
    int y, x, v;
} COORD;
COORD SUB[MAX_SUB];
int subN;
 
void CheckMatrix(int y, int x) {
    int dx = 0, dy = 0;
    for (; V[y][x + dx]; ++dx); // dx 가 있으면 조건 통과
    for (; V[y + dy][x]; ++dy); // V에 숫자가 있으면 조건 통과
 
    for (int ny = y; ny <= y + dy; ++ny)
        for (int nx = x; nx <= x + dx; ++nx) V[ny][nx] = 0;
 
    SUB[subN].y = dy;
    SUB[subN].x = dx;
    SUB[subN].v = dy * dx;
    ++subN;
}
 
int main() {
    freopen("input.txt""r", stdin);
    int T; scanf("%d"&T);
    for (int t = 1; t <= T; ++t) {
        /* Input */
        scanf("%d"&N);
        for (int i = 0; i < N; ++i)
            for (int j = 0; j < N; ++j) scanf("%d"&V[i][j]);
        /* Check Matrix */
        subN = 0;
        for (int i = 0; i < N; ++i)
            for (int j = 0; j < N; ++j)
                if (V[i][j]) CheckMatrix(i, j);
        /* Sort */
        for (int i = 0; i < subN; ++i)
            for (int j = i + 1; j < subN; ++j)
                if (SUB[i].v > SUB[j].v ||
                    (SUB[i].v == SUB[j].v && SUB[i].y > SUB[j].y)) {
                    COORD t = SUB[i]; SUB[i] = SUB[j]; SUB[j] = t;
                }
        /* Output */
        printf("#%d %d", t, subN);
        for (int i = 0; i < subN; ++i) {
            printf(" %d %d", SUB[i].y, SUB[i].x);
            //          SUB[i].y = SUB[i].x = SUB[i].v = 0;
        }
        printf("\n");
    }
    return 0;
}
 
cs


댓글