728x90
package Samsung;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
//경사로
public class Incline {
static int n, l;
static int[][] arr;
static boolean[][] check;
static int count = 0;
static int[] dx = {-1, 1, 0, 0}; //위, 아래, 왼, 오
static int[] dy = {0, 0, -1, 1};
static boolean canGo(int x, int y, int num) {
return x >= 0 && y >= 0 && x < n && y < n && arr[x][y] == num;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
l = Integer.parseInt(st.nextToken());
arr = new int[n][n];
check = new boolean[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i=0; i<n; i++){
if(go(i,0,0)){ //행
count++;
}
if(go(0,i,1)){ //열
count++;
}
}
System.out.println(count);
}
static boolean go(int x, int y, int dir){
boolean[] visited = new boolean[n];
int[] height = new int[n];
for(int i=0; i<n; i++){
height[i] = (dir==0)? arr[x][y+i] : arr[x+i][y];
}
for(int i=0; i<n-1; i++){
if(height[i]==height[i+1]){
continue;
}
if(Math.abs(height[i]-height[i+1])>1){
return false;
}
if(height[i]-1 == height[i+1]){
for(int j=i+1; j<=i+l; j++){
if(j>=n || visited[j] || height[j]!=height[i+1]){
return false;
}
visited[j]= true;
}
}
else if (height[i] + 1 == height[i + 1]) {
for (int j = i; j > i - l; j--) {
if (j < 0 || visited[j] || height[j] != height[i]) {
return false;
}
visited[j] = true;
}
}
}
return true;
}
}
- 같은 행 안에서 혹은 같은 열안에서 경사로 부분이 겹치지 않게 하면 된다. -> 처음에 같은 행과 열끼리 아니더라도 이미 경사로 만든 부분은 만들면 안되는 줄 암. 문제조건을 제대로 파악하자!