지저분 그자체
[정답 코드]
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
//디버깅용 프린트함수
void print(vector<vector<int>>&v) {
for (int i = 0; i < v.size(); i++) {
for (int j = 0; j < v[i].size(); j++) {
cout << v[i][j];
}
cout << "\n";
}
}
void print_2(vector<int>&v) {
for (int i = 0; i < v.size(); i++) {
cout << v[i];
}
}
const int MAX = 101;
int answer = 0; //답 개수
//N=세로,y M=가로,x
int N, M;
int L;
bool isContinued(vector<int>&v, int node) {
for (int i = 1; i <= L; i++) {
if (v[node] != v[node - i]) {
return false;
}
}
return true;
}
//행,열 한 줄의 정보를 받아서
//지나갈 수 있는 길의 개수를 찾는 함수
void find(vector<int>&v) {
//경사로 둔 곳 체크
bool vis[MAX];
memset(vis, false, sizeof(vis));
bool isPossible = true;
for (int i = 0; i < v.size(); i++) {
if (i + 1 >= N) {
answer += 1;
break;
}
if (v[i] == v[i + 1]) continue;
if (v[i] + 1 < v[i + 1] || v[i]>v[i+1]+1) {
isPossible = false;
break;
}
else if(v[i]<v[i+1]){
bool flag = true;
//현재기점, 이전L길이만큼 연속인가 check
if (L == 1) {
if (vis[i] == true) {
flag = false;
isPossible = false;
break;
}
}
else {
for (int j = 1; j < L; j++) {
if (i - j < 0) {
flag = false;
isPossible = false;
break;
}
if (v[i] != v[i - j]) {
flag = false;
isPossible = false;
}
if (vis[i - j] == true) {
flag = false;
isPossible = false;
}
}
}
if (flag) {
for (int j = 0; j < L; j++) {
vis[i - j] = true;
}
}
}
else if (v[i] > v[i + 1]) {
bool flag2 = true;
int next = i + 1;
if (L == 1) {
vis[next] = true;
continue;
}
//현재기점, 다음 L길이만큼 연속인가 check
for (int j = 1; j < L; j++) {
if (next + j >= N) {
flag2 = false;
isPossible = false;
break;
}
if (v[next] != v[next+j]) {
flag2 = false;
isPossible = false;
break;
}
if (vis[next + j] == true) {
flag2 = false;
}
}
if (flag2) {
for (int j = 0; j < L; j++) {
vis[next+j] = true;
}
}
}
if (!isPossible) break;
}
return;
}
int main() {
cin >> N >> L;
M = N;
//map 이차원 배열 선언
vector<vector<int>> map(N, vector<int>(M));
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> map[i][j];
}
}
//가로방향 탐색
for (int i = 0; i < N; i++) {
find(map[i]);
}
//세로방향은 어떻게 보지?
for (int j = 0; j < M; j++) {
vector<int> ymap;
for (int i = 0; i < N; i++) {
ymap.push_back(map[i][j]);
}
find(ymap);
}
cout << answer << "\n";
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
BOJ 17143 : 낚시왕 (0) | 2021.04.19 |
---|---|
BOJ 15686 : 치킨 배달 (0) | 2021.04.18 |
BOJ 14502 : 연구소 (0) | 2021.04.14 |
BOJ 16953 : A→B (0) | 2021.04.08 |
BOJ 7576 : 토마토 ☆ (0) | 2021.04.07 |