코테/SW Expert Academy

4014. [모의 SW 역량테스트] 활주로 건설

밤밭황제 2022. 4. 30. 16:13
#pragma warning (disable: 4996)

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace std;

int N, X;
int T;
void init_map(int m[][21])
{
	for (int i = 0; i < 21; i++)
	{
		memset(m[i], 0, sizeof(m[i]));
	}
}
int check_arr(int arr[])
{
	int installed[21] = { 0, };
	int able = 1;
	int pre = arr[0];
	for (int i = 1; i < N; i++)
	{
		int tem = arr[i];
		if (pre == tem)
			continue;
		if (tem != pre && abs(tem - pre) > 1) //차이가 1이상
		{
			return 0;
		}
		else if (tem - pre == 1) // check left left is lower
		{
			if (i - X >= 0)
			{
				for (int j = i - X; j < i; j++)
				{
					if (installed[j] == 1)
						return 0;
					if (arr[j] != pre)
						return 0;
				}
			}
			else return 0;
		}
		else if (pre - tem == 1) //check right // right is lower 
		{
			if (i + X - 1 < N)
			{
				int k;
				int pos = 1;
				for (k = i + 1; k < N; k++)
				{
					if (arr[k] != tem)
						break;
					if (arr[k] == tem)
						pos++;
				}
				if (pos < X)
					return 0;
				else if (pos >= X)
				{
					for (int t = i; t < i + X; t++)
					{
						installed[t] = 1;
					}
				}
				i = k - 1;
			}
			else return 0;
		}

		pre = arr[i];
	}
	return able;

}
int check(int m[][21])
{
	int cnt = 0;
	for (int i = 0; i < N; i++)
		cnt += check_arr(m[i]);
	return cnt;
}
int main()
{
	scanf("%d", &T);
	for (int i = 0; i < T; i++)
	{
		N = 0;
		X = 0;
		int map[21][21];
		int map_c_r[21][21];
		init_map(map);
		init_map(map_c_r);
		scanf("%d %d", &N, &X);
		for (int j = 0; j < N; j++)
		{
			for (int k = 0; k < N; k++)
			{
				int num = 0;
				scanf("%d", &num);
				map[j][k] = num;
				map_c_r[k][j] = num;
			}
		}

		int ans = check(map) + check(map_c_r);
		printf("\n#%d %d\n", i + 1, ans);
	}
}
728x90