[BaekJoon]1080行列


1.  質問リンク


https://www.acmicpc.net/problem/1080

2.  質問する




サマリ


1つのマトリクスA,Bは
  • 0と1のみからなり,問題は3*3サイズの部分マトリクスのすべての要素を反転させて,AをBに変換するのに必要な最小演算回数を求めることである.
  • 入力
  • :第1行では、行列の大きさはN、Mであり、50以下である.第2行から始まるN行では、行列Aは第2行にあり、第2行から始まるN行では、行列Bは第2行にある.
  • 出力:AをBに変換するために必要な最小演算数を出力します.
  • 3.  ソースコード

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.StringTokenizer;
    
    public class Main {
    	static int[][] matrix;
    	static int[][] result_matrix;
    	
    	public int getMinConvert() {
    		int count = 0;
    		for(int i = 0; i < matrix.length - 2; i++) {
    			for(int j = 0; j < matrix[i].length - 2; j++) {
    				if(matrix[i][j] != result_matrix[i][j]) {
    					for(int k = i; k < i + 3; k++) {
    						for(int l = j; l < j + 3; l++) {
    							if(matrix[k][l] == 1) {
    								matrix[k][l] = 0;
    							} else {
    								matrix[k][l] = 1;
    							}
    						}
    					}
    					count++;
    				}
    			}
    		}
    		
    		for(int i = 0; i < matrix.length; i++) {
    			for(int j = 0; j < matrix[i].length; j++) {
    				if(matrix[i][j] != result_matrix[i][j]) {
    					return -1;
    				}
    			}
    		}
    		return count;
    	}
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    		String input = br.readLine();
    		StringTokenizer st = new StringTokenizer(input);
    		int row = Integer.parseInt(st.nextToken());
    		int col = Integer.parseInt(st.nextToken());
    		matrix = new int[row][col];
    		result_matrix = new int[row][col];
    		for(int i = 0; i < row; i++) {
    			input = br.readLine();
    			for(int j = 0; j < col; j++) {
    				matrix[i][j] = input.charAt(j) - '0';
    			}
    		}
    		for(int i = 0; i < row; i++) {
    			input = br.readLine();
    			for(int j = 0; j < col; j++) {
    				result_matrix[i][j] = input.charAt(j) - '0';
    			}
    		}
    		br.close();
    		Main m = new Main();
    		bw.write(m.getMinConvert() + "\n");
    		bw.flush();
    		bw.close();
    	}
    }

    4.  に近づく

  • これはGRIDアルゴリズムを用いて(0,0)~(N−3,M−3)から3*3行列を表示および変更する問題であり、Bと同じ変更回数を求める.
  • 行列Aについては、(0,0)から右下に3*3行列を変更します.
  • 行列を置換する場合は、3*3行列のAとBが左上隅の値に対して等しいことを確認し、異なる場合は変更します.
  • は、3*3行列の左上隅の値がこの行列に到達したときにのみ変更されるためです.
  • 2で各ケース1回行い、変更回数を1回加算(N−3、M−3).