2. 색상 통일(중)

View as PDF

Submit solution

Points: 10
Time limit: 1.0s
Memory limit: 64M

Author:
Problem type

조컴공은 알고리즘 중간고사가 끝난 기념으로 간단한 게임을 하려고 한다.

이 게임은 \(3 \times 3\)의 격자로 이루어지고, 각 칸은 흰색 또는 검은색이다.

컴공이가 어떤 칸을 선택하면 그 칸의 색이 반전되며, 그와 동시에 선분을 공유하는 인접한 칸들 또한 색이 반전된다.

예를 들어 \((1, 2)\)를 선택하면 \((1, 1), (1, 2), (1, 3), (2, 2)\)의 색이 반전된다.

이것을 여러 번 시도하고, 진행 도중에 모든 칸의 색이 동일해지면 게임이 즉시 종료된다.

컴공이는 중간고사로 인해 머리가 지끈지끈하기 때문에 아무렇게나 칸을 눌러서 게임이 클리어되기만을 바라고 있다.

몇 번의 시도 만에 게임이 종료될까?

입력

  • 첫 번째 줄부터 세 번째 줄까지 격자의 초기 상태가 주어진다. 0은 흰색이며, 1은 검은색이다.
  • 그 다음 줄에 시도한 횟수 N이 주어진다.\((1 ≤ N ≤ 10000)\)
  • 그 다음 줄부터 \(N\)개의 줄에 컴공이가 선택한 행 번호 \(r\)과 열 번호 \(c\)가 주어진다. 번호는 1부터 3까지 매겨져 있다.

출력

  • 몇 번의 시도에 게임이 종료되는지 출력하고, 만약 모든 시도가 끝나도 게임이 종료되지 않는다면 -1을 출력한다.

입력 예시 1

1 0 0
0 1 1
1 0 0
3
2 2
2 3
3 1

출력 예시 1

2

입력 예시 2

1 0 0
0 1 1
1 0 0
3
2 2
3 1
2 3

출력 예시 2

-1

Comments


  • 1
    S20213235  commented on Nov. 7, 2022, 6:16 p.m. edit 10

    TS 건의
    모든 색이 같은 입력에 대한 TS가 존재하지 않습니다.
    따라서 TS가 추가되어야 합니다.

    0 0 0
    0 0 0
    0 0 0
    1
    1 2
    // Wrong Answer: -1
    // Answer: 0
    

    • 0
      mskang  commented on Dec. 12, 2022, 7:47 p.m. edited

      Good Comment!!, 감사합니다.


  • 0
    mskang  commented on Nov. 12, 2020, 1:45 p.m.

    아래와 같이 코드를 직접적으로 올리는 것은 금지합니다. 이 기능은 문제에 대한 힌트, 코딩 방법에 대한 질문과 응답을 위한 기능입니다. 저를 포함한 여러분들이 질문자이면서 답변자가 될 수 있습니다. 그러나, 문제에 대한 working code를 직접 포스팅 한 경우, 그 포스팅한 사람에게 페널티를 부과하겠습니다. 여러분들의 주의를 부탁드립니다. 강문수 드림.


  • 0
    S20174315  commented on Nov. 12, 2020, 2:44 a.m.

    import java.util.Scanner; class Change { static int SuccessTime; static int howmany[]=new int[1000]; static int t=0; static void ColorChange(int[][] a,int x,int y){ if(x>=0 && y>=0 &&y<a.length && x<a.length && a[x][y]==0) a[x][y]=1;

      else if(x>=0 && y>=0 &&y<a.length && x<a.length && a[x][y]==1) a[x][y]=0;

    }

    static void ChangeSide(int[][] a,int x,int y) { ColorChange(a,x,y); ColorChange(a,x-1,y); ColorChange(a,x+1,y); ColorChange(a,x,y-1); ColorChange(a,x,y+1); }

    static void IsAllOne(int[][] a,int Times) {// 색이 전부 같다면 그 시간을 SuccessTime 에 저장 if(a[0][0]==1 && a[0][1]==1 && a[0][2]==1 && a[1][0]==1 && a[1][1]==1 && a[1][2]==1 &&a[2][0]==1 && a[2][1]==1 && a[2][2]==1) { howmany[t++]=Times; } if(a[0][0]==0 && a[0][1]==0 && a[0][2]==0 && a[1][0]==0 && a[1][1]==0 && a[1][2]==0 &&a[2][0]==0 && a[2][1]==0 && a[2][2]==0) { howmany[t++]=Times; } SuccessTime=howmany[0]; } static void PrintSuc() { if(SuccessTime>0) System.out.println(SuccessTime); else System.out.println(-1); }

    }

    public class Color {

    public static void main(String[] args) { Scanner sc =new Scanner(System.in); int tries; int[][] grid=new int[3][3]; for(int j=0; j<3; j++) for(int i=0; i<3; i++) grid[j][i]=sc.nextInt();

      tries=sc.nextInt();
    
      int RC[]= new int[2*tries]; 
      for(int i=0; i<RC.length; i++)
         RC[i]=sc.nextInt();
    
      for(int i=0; i<tries; i++) {
      Change.ChangeSide(grid,RC[2*i]-1,RC[2*i+1]-1); 
      Change.IsAllOne(grid, i+1); 
      }
      Change.PrintSuc(); 
    
      sc.close();

    }

    }