백준
백준2160 - 그림비교
개발하는꼬마
2019. 8. 26. 00:16
https://www.acmicpc.net/problem/2160
2160번: 그림 비교
N(2≤N≤50)개의 그림이 있다. 각각의 그림은 5×7의 크기이고, 두 가지 색으로 되어 있다. 이때 두 가지의 색을 각각 ‘X’와 ‘.’으로 표현하기로 하자. 이러한 그림들이 주어졌을 때, 가장 비슷한 두 개의 그림을 찾아내는 프로그램을 작성하시오. 두 개의 그림에서 다른 칸의 개수가 가장 적을 때, 두 개의 그림이 가장 비슷하다고 하자. 예를 들어 위와 같은 두 개의 그림이 주어졌을 때, 색칠한 부분이 서로 다르게 된다. 위의 그림은 5개의 칸이 서
www.acmicpc.net
클래스를 이용하여 푼 문제이다. 객체의 5 X 7 공간을 두 개씩 비교하여 최솟값을 출력한다.
#include <iostream>
using namespace std;
int a, b; //서로 다른 곳의 갯수가 최소인 공간의 좌표 a, b
int small = 10000; //다른 곳의 수
//5 X 7 공간의 정보를 담은 클래스
class box {
public:
char mat[5][7]; //5 X 7 공간의 정보
box() {} //생성자
void init() { //5 X 7 공간 입력 함수
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 7; j++) {
cin >> mat[i][j];
}
}
}
};
//다른 곳을 찾아주는 함수, 최솟값이 갱신되면 true반환 그렇지 못하면 false 반환
bool diff(box m1, box m2) {
int cnt = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 7; j++) {
if (m1.mat[i][j] != m2.mat[i][j]) {
cnt++;
}
}
}
if (small > cnt) {
small = cnt;
return true;
}
return false;
}
int main() {
int n;
box* ptr;
cin >> n;
ptr = new box[n]; //n개의 좌표 동적할당
for (int i = 0; i < n; i++) {
ptr[i].init();
}
//k와 l의 공간을 입력받아 서로 다른 공간을 비교
for (int k = 0; k < n - 1; k++) {
for (int l = k + 1; l < n; l++) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 7; j++) {
if (diff(ptr[k], ptr[l])) {
a = k + 1;
b = l + 1;
}
}
}
}
}
cout << a << ' ' << b;
}