๐ ํด๊ฒฐ ๋ฐฉ๋ฒ
- ํ ์ด์ ๋ํด ๊ฒ์ฌํ๋ bfsRow()์ bfsCol()์ ๋ง๋ฆ.
- ์ฌ๊ท๋ก ๊ตฌํํ ์๋ ์์์ํ
๋ฐ queue๋ฅผ ์ฐ๋๊ฒ ๋ ํธํ ๊ฒ ๊ฐ์์ ์ด๋ ๊ฒ ์งฌ.
- ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ ๊ฒฝ์ฌ๋ก๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ ๊ตฌ๋ถํ๊ธฐ ์ํด already๋ผ๋ boolํ ๋ฒกํฐ๋ฅผ ๋ง๋ค์ด๋๊ณ ํ์ ์์.
- ๊ฒฝ์ฐ์ ์๋ ๋ค์๊ณผ ๊ฐ์
- ์์ผ๋ก ์ด๋ํ ๊ณณ์ ๋์ด๊ฐ ๋ ๋์ ๊ฒฝ์ฐ
- ๋ ๋ฎ์ ๊ฒฝ์ฐ
- ๊ฐ ๊ฒฝ์ฐ์ ๋ง๊ฒ ๊ฒฝ์ฌ๋ก๋ฅผ ์ค์นํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํด์ ๋ถ๊ฐํ๋ฉด false๋ฅผ ๋ฆฌํดํ๋๋ก ํจ์๋ฅผ ์ค๊ณํจ.
๐ ์ฝ๋ (์ฃผ์ ํฌํจ)
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
struct Axis {
int x;
int y;
};
int n, l;
vector<vector<int>> v;
bool bfsRow(int idx) {
// ROW ๊ธฐ์ค
vector<int> already(n, false);
queue<Axis> q;
q.push({idx, 0});
while(!q.empty()) {
Axis now = q.front();
q.pop();
int mx = now.x;
int my = now.y + 1;
if (my >= n) break;
// ๊ฒฝ์ฌ ์ฐจ์ด๊ฐ 2 ์ด์ ๋๋ค๋ฉด ๋ถ๊ฐ
if (abs(v[now.x][now.y] - v[mx][my]) > 1) return false;
// ๊ฒฝ์ฌ ์ฐจ์ด๊ฐ 1์ธ๋ฐ, ๊ฒฝ์ฌ๋ก๋ฅผ ๋์ ์ ์์ผ๋ฉด ๋ถ๊ฐ
// 1. ์์ผ๋ก ์ด๋ํ ๋์ด๊ฐ ๋ ๋์ ๋
if (v[now.x][now.y] < v[mx][my]) {
// ๋ฎ์์ชฝ ๊ธธ์ด๊ฐ l์ด์์ธ์ง, ์ด๋ฏธ ๋์ฌ์ง ๊ฒฝ์ฌ๋ก๊ฐ ์๋์ง ์ฒดํฌ
int startIdx = now.y - l + 1;
if (startIdx < 0) return false;
for (int i=now.y; i>=startIdx; i--) {
if (v[now.x][now.y] != v[now.x][i] || already[i]) return false;
}
// ๊ฒฝ์ฌ๋ก ์ถ๊ฐ
for (int i=now.y; i>=startIdx; i--) {
already[i] = true;
}
}
// 2. ์์ผ๋ก ์ด๋ํ ๋์ด๊ฐ ๋ ๋ฎ์ ๋
else if (v[mx][my] < v[now.x][now.y]) {
// ์ด๋ํ ๊ณณ์ ๊ฒฝ์ฌ๋ก ๋๊ณ , l๋งํผ ๊ธธ์ด๊ฐ ์ ์ง๋๋์ง ํ์ธ
int endIdx = my + l - 1;
if (endIdx >= n) return false;
for (int i=my; i<= endIdx; i++) {
if (v[mx][my] != v[mx][i] || already[i]) return false;
}
for (int i=my; i<= endIdx; i++) {
already[i] = true;
}
// l๋งํผ ์ ์ง๋๋ค๋ฉด ๊ฒฝ์ฌ๋ก๊ฐ ๋๋๋ ์์น๋ฅผ push
my = endIdx;
}
// ์ ์ผ์ด์ค ๋ชจ๋ ํต๊ณผ ์ ํจ์ค
q.push({mx, my});
}
return true;
}
bool bfsCol(int idx) {
// COL ๊ธฐ์ค
vector<int> already(n, false);
queue<Axis> q;
q.push({0, idx});
while(!q.empty()) {
Axis now = q.front();
q.pop();
int mx = now.x + 1;
int my = now.y;
if (mx >= n) break;
// ๊ฒฝ์ฌ ์ฐจ์ด๊ฐ 2 ์ด์ ๋๋ค๋ฉด ๋ถ๊ฐ
if (abs(v[now.x][now.y] - v[mx][my]) > 1) return false;
// ๊ฒฝ์ฌ ์ฐจ์ด๊ฐ 1์ธ๋ฐ, ๊ฒฝ์ฌ๋ก๋ฅผ ๋์ ์ ์์ผ๋ฉด ๋ถ๊ฐ
// 1. ์์ผ๋ก ์ด๋ํ ๋์ด๊ฐ ๋ ๋์ ๋
if (v[now.x][now.y] < v[mx][my]) {
// ๋ฎ์์ชฝ ๊ธธ์ด๊ฐ l์ด์์ธ์ง, ์ด๋ฏธ ๋์ฌ์ง ๊ฒฝ์ฌ๋ก๊ฐ ์๋์ง ์ฒดํฌ
int startIdx = now.x - l + 1;
if (startIdx < 0) return false;
for (int i=now.x; i>=startIdx; i--) {
if (v[now.x][now.y] != v[i][now.y] || already[i]) return false;
}
// ๊ฒฝ์ฌ๋ก ์ถ๊ฐ
for (int i=now.x; i>=startIdx; i--) {
already[i] = true;
}
}
// 2. ์์ผ๋ก ์ด๋ํ ๋์ด๊ฐ ๋ ๋ฎ์ ๋
else if (v[mx][my] < v[now.x][now.y]) {
// ์ด๋ํ ๊ณณ์ ๊ฒฝ์ฌ๋ก ๋๊ณ , l๋งํผ ๊ธธ์ด๊ฐ ์ ์ง๋๋์ง ํ์ธ
int endIdx = mx + l - 1;
if (endIdx >= n) return false;
for (int i=mx; i<= endIdx; i++) {
if (v[mx][my] != v[i][my] || already[i]) return false;
}
for (int i=mx; i<= endIdx; i++) {
already[i] = true;
}
// l๋งํผ ์ ์ง๋๋ค๋ฉด ๊ฒฝ์ฌ๋ก๊ฐ ๋๋๋ ์์น๋ฅผ push
mx = endIdx;
}
// ์ ์ผ์ด์ค ๋ชจ๋ ํต๊ณผ ์ ํจ์ค
q.push({mx, my});
}
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
// ํ๋์ ํ, ์ด์ ๋ํด์ ๋์ด ์ฐจ์ด๊ฐ ๋ ๋
// ๋ฎ์ ๋์ด ์ชฝ ๊ธธ์ด๊ฐ L๋งํผ ์ด์ด์ง๋ค๋ฉด
// ๊ฒฝ์ฌ๋ก๋ฅผ ๋์ ์ ์์.
int cnt = 0;
cin >> n >> l;
v = vector<vector<int>> (n, vector<int>(n));
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
cin >> v[i][j];
}
}
for (int i=0; i<n; i++) {
// ํ ๊ธฐ์ค ๊ฒ์ฌ
if (bfsRow(i)) {
cnt++;
}
// ์ด ๊ธฐ์ค ๊ฒ์ฌ
if (bfsCol(i)) {
cnt++;
}
}
cout << cnt << '\n';
return 0;
}