본문 바로가기
[C++] 알고리즘 교육/1~4. 기본기

[알고리즘 3.1.10] 간단한 완전 탐색 - rook

by 안산학생 2019. 4. 26.

문제


체스에서 룩이라는 기물은 막혀있지만 않으면 룩의 위치에서 같은 행, 같은 열에 해당하는 칸 중 하나로 한 번 이동할 수 있다. 단, 특정 칸이 막혀있다면 그 칸에서부터 더 나아갈 수는 없다. 만약 룩이 아래 그림과 같이 5행 4열에 존재하고 같은 행열에 기물이 없다면 5행이나 4열에 존재하는 칸 중 어디로든 갈 수 있다. 예를 들어, 5행 2열 혹은 1행 4열로 움직일 수 있다. 차례에 주어진 이동 횟수는 한 번이므로 이동이 완료되었다면 상대방의 차례로 넘어간다.

체스는 킹만 잡히면 지게 되는 게임이다. 그 중에서도 알랩이는 룩으로 인해 게임을 지는 것을 극도로 싫어한다!

현재 차례가 상대의 차례일 때, 주어진 체스판의 상태에서 알랩이의 킹이 상대방의 룩에게 잡힐 가능성이 있는지 알아보자.

 

입력


8줄에 걸쳐 8x8 체스판의 상태가 주어진다. 이때 0은 기물이 없는 상태이고, 1은 알랩이의 킹을 의미하고, 2는 상대의 룩을 의미하며 3은 그 외 다른 기물들을 의미한다. (킹은 하나만 존재하며, 상대의 룩은 최대 2개까지 있을 수 있다. 그 외 기물들은 최대 29개까지 있을 수 있다.)

 

출력


킹이 룩에게 잡힐 가능성이 있으면 1, 아니면 0을 출력한다.

 

예제 입력 1

0 3 0 0 0 0 0 0

3 1 0 0 0 0 2 0

0 3 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

예제 출력 1

1

 

예제 입력 2

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 3 3 0 0 0 0 0

3 0 1 0 3 0 2 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

예제 출력 2

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
 
int main() {
 
  int arr[8][8];
  int i,j;
  int ki, kj;
  int ri, rj;
  int checkmate = 0;
  
  for(i=0;i<8;i++){
    for(j=0;j<8;j++){
      scanf("%d",&arr[i][j]);
      if(arr[i][j]==1){
        ki = i;
        kj = j;
      }else if(arr[i][j]==2){
        ri = i;
        rj = j;
      }
    }
  }
  
  for(i=ri;i<8;i++){
    if(arr[i][rj]==3){
      break;
    }else if(arr[i][rj]==1){
      checkmate = 1;
      break;
    }
  }
  
  if(checkmate != 1){
    for(i=ri;i>=0;i--){
      if(arr[i][rj]==3){
        break;
      }else if(arr[i][rj]==1){
        checkmate = 1;
        break;
      }
    }
  }
  
  if(checkmate != 1){
    for(i=rj;i<8;i++){
      if(arr[ri][i]==3){
        break;
      }else if(arr[ri][i]==1){
        checkmate = 1;
        break;
      }
    }
  }
  
  if(checkmate != 1){
    for(i=rj;i>=0;i--){
      if(arr[ri][i]==3){
        break;
      }else if(arr[ri][i]==1){
        checkmate = 1;
        break;
      }
    }
  }
  
  
  printf("%d",checkmate);
  
  return 0;
}

 

댓글