https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeW7FakkUDFAVH
#include <iostream>
#include <vector>
#include <algorithm>
#
using namespace std;
const int MAX = 102;
int n, l;
int map[MAX][MAX];
int answer = 0;
bool CheckWay(vector<int> v) {
vector<int> visited(n, -1);
bool flag = true;
for (int i = 0; i < n; i++) {
int index = i + 1;
int count = 1;
if (index == n) return true;
while (index < n && v[i] == v[index]) {
count++;
index++;
}
if (index == n || count==n) return true;
if (v[index] - v[i] == 1) { //높아지는 경우
int value = 0;
int tmp_index = index - 1;
while (tmp_index >= i && v[tmp_index] == v[i] && visited[tmp_index] == -1) {
value++;
tmp_index--;
}
if (value >= l) {
i = index - 1;
index--;
for (int k = l; k > 0; k--) {
visited[index] = 1;
index--;
}
}
else {
flag = false;
break;
}
}
else if (v[i] - v[index] == 1) { //낮아지는 경우
int value = 0;
int tmp_index = index;
while (tmp_index < n && v[tmp_index] == v[index] && visited[tmp_index] == -1) {
value++;
tmp_index++;
}
if (value >= l) {
if (tmp_index >= n) return true;
for (int k = l; k > 0; k--) {
visited[index] = 1;
index++;
}
i = index - 2;
}
else {
flag = false;
break;
}
}
else return false;
}
return flag;
}
int main(void) {
int testcase;
cin >> testcase;
int index = 1;
for (; testcase > 0; testcase--) {
cin >> n >> l;
answer = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < n; i++) {
vector<int> v;
v.resize(n);
for (int j = 0; j < n; j++) {
v[j] = map[i][j];
}
if (CheckWay(v) == true) {
answer++;
}
}
for (int j = 0; j < n; j++) {
vector<int> v;
v.resize(n);
for (int i = 0; i < n; i++) {
v[i] = map[i][j];
}
if (CheckWay(v) == true) {
answer++;
}
}
cout << "#"<< index << " " << answer << endl;
index++;
}
}
'백준 알고리즘 > 구현' 카테고리의 다른 글
벽돌 깨기 C++ (0) | 2022.04.24 |
---|---|
특이한 자석 C++ (0) | 2022.04.23 |
줄기세포 배양 C++ (0) | 2022.04.23 |
로봇 시뮬레이션 C++ (0) | 2022.03.09 |
스위치 켜고 끄기 (0) | 2022.03.08 |