열 탐색은 캐시 프렌들리 하지않다.
그래서 "대칭행렬"을 만들어서 같은 함수를 호출 두번만 해주는 식으로 바꿔야한다.
(전치행렬)
cnt 늘려주는 부분도 올라갈 경우 ++cnt하다 l과 같은지보고
cnt를 음수까지 확장해서 ++cnt해서 0과 값을 비교한다.
어려웠음..
일단 전치행렬 사용한다는 부분과 cnt를 음수까지확장해서 카운트 하는 부분과
Sovle의 for문 로직을 돌고나서 cnt값을 최종적으로 가능한 값인지 아닌지 if문으로 확인 하는 부분이 좀 지렸던거 같다.
#include <iostream>
#include <cstring>
using namespace std;
#define endl "\n"
#define ll long long
#define MAX 104
int n, l, a[MAX][MAX], b[MAX][MAX], ret = 0;
void Solve(int arr[MAX][MAX])
{
for (int i = 0; i < n; ++i)
{
int cnt = 1;
int j;
for (j = 0; j < n - 1; j++)
{
// 같은 경우
if (arr[i][j] == arr[i][j + 1]) cnt++;
// 1칸 더 작은 경우 (올라가는 경사로, 현재 위치가 더 낮다)
else if (arr[i][j] + 1 == arr[i][j + 1] && cnt >= l) cnt = 1;
// 1칸 더 작은 경우 (내려가는 경사로, 현재 위치가 더 높다)
else if (arr[i][j] - 1 == arr[i][j + 1] && cnt >= 0) cnt = -l + 1;
else break;
}
if (j == n - 1 && cnt >= 0) ret++;
}
return;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> l;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cin >> a[i][j];
b[j][i] = a[i][j];
}
}
Solve(a);
Solve(b);
cout << ret << endl;
return 0;
}