티스토리 뷰

백준

백준 소스코드 [C++] 14890 경사로

Hani_Levenshtein 2021. 2. 5. 11:02

www.acmicpc.net/problem/14890

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

백준 소스코드 [C++] 14890 경사로

#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>
#include <limits.h>
#include <vector>
#include <math.h>
#include <stack>
#include <bitset>
#include <string>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

int n, m;
int arr[101][101];

void road() {
	int res = 0;
	for (int i = 1;i <= n;i++) {
		int stack = 1;
		bool ok = true;
		for (int j = 2;j <= n;j++) {
			if (arr[i][j - 1] == arr[i][j]) stack++;

			else if (arr[i][j - 1] + 1 == arr[i][j]) {
				if (stack < m) {ok = false;break;}
		
				stack = 1;
			}

			else if (arr[i][j - 1] - 1 == arr[i][j]) {
				if (n < j + m-1) { ok = false;break; }
				int chk = 0;
				for (int k = j;k < j + m;k++)
					if (arr[i][k] == arr[i][j]) chk++;
					else break;
				if (chk == m) {
					j = j + m-1;
					stack = 0;
				}
				else { ok = false;break; }
			}

			else { ok = false;break; }
		}
		if (ok) res++;
	}

	for (int i = 1;i <= n;i++) {
		int stack = 1;
		bool ok = true;
		for (int j = 2;j <= n;j++) {
			if (arr[j - 1][i] == arr[j][i]) stack++;

			else if (arr[j - 1][i] + 1 == arr[j][i]) {
				if (stack < m) { ok = false;break; }
			
				stack = 1;
			}

			else if (arr[j - 1][i] - 1 == arr[j][i]) {
				if (n < j + m - 1) { ok = false;break; }
				int chk = 0;
				for (int k = j;k < j + m;k++)
					if (arr[k][i] == arr[j][i]) chk++;
					else break;
				if (chk == m) {
					j = j + m - 1;
					stack = 0;
				}
				else { ok = false;break; }
			}

			else { ok = false;break; }
		}
		if (ok) res++;
	}



	cout << res;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> m;
	for (int i = 1;i <= n;i++)for (int j = 1;j <= n;j++)cin >> arr[i][j];
	road();
	return 0;
}
댓글