백준 문제풀이/BRUTE FORCE
SWEA 2105 : [모의 SW 역량테스트] 디저트 카페
준코딩
2020. 5. 29. 20:26
문제
문제 풀어보기
풀이
이 문제는 완전 탐색 문제입니다.
우선 탐색을 시작할 시작점의 좌표를 정하는 FOR문 두 개
두 대각선의 길이를 정하는 FOR문 두 개를
메인에서 정해줍니다.
그리고 그 조건으로 문제를 푸는 거죠.
허접하지만 이해를 돕기 위해 그림을 그려보면
저는 시작점을 왼쪽 끝에 있는 파란 동그라미로 잡았습니다.
시작점을 어느 점으로 정 하냐에 따라 순서가 조금씩 달라질 수 있습니다.
그리고 두대 각선의 길이는 빨간색선으로 표시했습니다.
굉장히 유사한 문제를 가져왔습니다.
https://www.acmicpc.net/problem/17779
17779번: 게리맨더링 2
재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름��
www.acmicpc.net
코드
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
#define safe(x,y) x>=n || x<0 || y<0 || y>=n
//int dx[] = { 1,-1 ,0,0 };
//int dy[] = { 0,0,1,-1 };
// 아래 위 오른쪽 왼쪽
int dx[] = { -1, 1, 1, -1 };
int dy[] = { 1, 1, -1 , -1 };
// 대각선
int n;
int arr[25][25];
int ans;
void go(int i, int j, int d1 , int d2) {
int x = i;
int y = j;
vector<bool> check(101, false);
check[arr[i][j]] = true;
int sum = 1;
for (int k = 0; k < 4; k++) {
if (k % 2 == 0) { // d1
for (int r = 0; r < d1; r++) {
x += dx[k];
y += dy[k];
if (safe(x, y) || check[arr[x][y]]) return;
check[arr[x][y]] = true;
sum += 1;
}
}
else {
for (int r = 0; r < d2; r++) {
x += dx[k];
y += dy[k];
if (x == i && y == j) break; // 다 돌았다면
if (safe(x, y) || check[arr[x][y]]) return;
check[arr[x][y]] = true;
sum += 1;
}
}
}
if (sum > ans) ans = sum;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T;
for (int t = 1; t <= T; t++) {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> arr[i][j];
}
}
ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int r = 1; r <= n; r++) {
for (int c = 1; c <= n; c++) {
go(i, j, r, c);
}
}
}
}
if (ans == 0) ans = -1;
cout << "#" << t << ' ';
cout << ans << endl;
}
return 0;
}