[解答-伯俊]17822かいてんえんばん


かいてんえんばん


アイデア
  • 原版をプロトタイプリストに変換し、
  • を考慮する.
    実施方法
  • ターンテーブル(回転)
  • Temp keep
  • をプリメモリし、上書き
  • Temppullの値は
  • を上書きします.
  • Temppull temp keepの値
  • を含む
  • と同じ値があるかどうかを確認します(check)
    値が
  • の場合、temp matrixに表示されます.
  • 、複数の同一値に対応する場合
    値が
  • の場合、isSameに表示されます.
  • 以降同じ値が存在しない場合、平均値を計算すると、
  • はオリジナルの値を変更します.
    予期しないエラー
  • ランタイムエラー
  • Calculate関数では、cntが0の場合、分母は0になるため、実行時にエラーが発生します.
  • cntが0という言葉は全て消去という意味ですが、最初は全て消去すると同じ数字がないと考えられていたのでcalculate関数は実行しませんでした.
  • しかし、すべて消去された状態で回転が完了していない場合、より多くの回転と同じ数字がないため、計算関数が実行されます.cntが0であるため、実行時エラー
  • の平均値を求める前に、cntが0であれば直ちに戻る
  • どうせcntが0なら消されるのでもう触る必要はありません
  • 問題解釈エラー
  • 回転が終了するたびに、チェックインして隣接できない場合は、平均値を要求して値を変更する必要があります.
  • 理解が間違っていて、回転がすべて終わって、平均値の計算を求めて、更にこれらの値を加えて答えを求めて、
  • 難点
  • Javaで実装する場合、負数を正数で割った残りの値を求めると、答えは負数になります
  • ex)-1%2=>pythonは1、javaは-1
  • コード#コード#
  • python
  • def rotate(i, dir, count):
        for cnt in range(count):
            temp_pull = matrix[i][0]
            nj = 0
            for j in range(M):
                nj = (nj+direct[dir]) % M
                temp_keep = matrix[i][nj]
                matrix[i][nj] = temp_pull
                temp_pull = temp_keep
    
    
    def check():
        isSame = False
        for i in range(N):
            for j in range(M):
                nj = (j+1)%M
                if matrix[i][j] and (matrix[i][j] == matrix[i][nj]):
                    isSame = True
                    temp_matrix[i][j] = -1
                    temp_matrix[i][nj] = -1
    
        for j in range(M):
            for i in range(N-1):
                if matrix[i][j] and matrix[i][j] == matrix[i+1][j]:
                    isSame = True
                    temp_matrix[i][j] = -1
                    temp_matrix[i+1][j] = -1
    
        for i in range(N):
            for j in range(M):
                if temp_matrix[i][j] == -1:
                    matrix[i][j] = 0
                    temp_matrix[i][j] = -1
        if isSame:
            return True
        else:
            return False
    
    
    def calculate(cnt):
        sum = 0
        for i in range(N):
            for j in range(M):
                if matrix[i][j]:
                    cnt += 1
                    sum += matrix[i][j]
        if not cnt:
            return
        avg = sum / cnt
        for i in range(N):
            for j in range(M):
                if matrix[i][j]:
                    if matrix[i][j] > avg:
                        matrix[i][j] -= 1
                    elif matrix[i][j] < avg:
                        matrix[i][j] += 1
    
    
    N, M, T = map(int, input().split())
    direct = [1, -1]
    matrix = [list(map(int, input().split())) for _ in range(N)]
    rotate_data = [list(map(int, input().split())) for _ in range(T)]
    for t in range(T):
        x, d, k = rotate_data[t][0], rotate_data[t][1], rotate_data[t][2]
        for num in range(1, N+1):
            if num % x == 0:
                rotate(num-1, d, k)
        temp_matrix = [[0] * M for _ in range(N)]
        if not check():
            calculate(0)
    result = 0
    for i in range(N):
        for j in range(M):
            if matrix[i][j]:
                result += matrix[i][j]
    print(result)
  • java
  • import java.util.*;
    import java.io.*;
    
    public class Main {
    	static int N, M, T;
    	static int[] direct = {
    			1, -1
    	};
    	static int[][] matrix;
    	static int[][] rotateData;
    	
    	public static void rotate(int idx, int dir, int count) {
    		int tempPull, tempKeep, nj;
    		for (int cnt=0; cnt<count; cnt++) {
    			tempPull = matrix[idx][0];
    			if (dir == 1) {
    				nj = M;
    			} else {
    				nj = 0;
    			}
    			for (int j=0; j<M; j++) {
    				nj = (nj+direct[dir]) % M;
    				tempKeep = matrix[idx][nj];
    				matrix[idx][nj] = tempPull;
    				tempPull = tempKeep;
     			}
    		}
    	}
    	
    	public static boolean check() {
    		boolean isSame = false;
    		int nj;
    		int[][] tempMatrix = new int[N][M];
    		for (int i=0; i<N; i++) {
    			for (int j=0; j<M; j++) {
    				nj = (j+1) % M;
    				if (matrix[i][j] > 0 && (matrix[i][j] == matrix[i][nj])) {
    					isSame = true;
    					tempMatrix[i][j] = -1;
    					tempMatrix[i][nj] = -1;
    				}
    			}
    		}
    		for (int j=0; j<M; j++) {
    			for (int i=0; i<N-1; i++) {
    				if (matrix[i][j] > 0 && (matrix[i][j] == matrix[i+1][j])) {
    					isSame = true;
    					tempMatrix[i][j] = -1;
    					tempMatrix[i+1][j] = -1;
    				}
    			}
    		}
    		for (int i=0; i<N; i++) {
    			for (int j=0; j<M; j++) {
    				if (tempMatrix[i][j] == -1) {
    					matrix[i][j] = 0;
    				}
    			}
    		}
    		if (isSame) {
    			return true;
    		} else {
    			return false;
    		}
    	}
    	
    	public static void calculate(int cnt) {
    		int sum = 0;
    		double avg = 0;
    		for (int i=0; i<N; i++) {
    			for (int j=0; j<M; j++) {
    				if (matrix[i][j] > 0) {
    					cnt ++;
    					sum += matrix[i][j];
    				}
    			}
    		}
    		if (cnt != 0) {
    			avg = (double)sum / (double)cnt;
    			for (int i=0; i<N; i++) {
    				for (int j=0; j<M; j++) {
    					if (matrix[i][j] > 0) {
    						if (matrix[i][j] > avg) {
    							matrix[i][j] --;
    						} else if (matrix[i][j] < avg) {
    							matrix[i][j] ++;
    						}
    					}
    				}
    			}
    		}
    	}
    	
    	public static void main(String[] args) throws Exception {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    		int x, d, k;
    		int result = 0;
    		N = Integer.parseInt(st.nextToken());
    		M = Integer.parseInt(st.nextToken());
    		T = Integer.parseInt(st.nextToken());
    		matrix = new int[N][M];
    		for (int i=0; i<N; i++) {
    			st = new StringTokenizer(br.readLine(), " ");
    			for (int j=0; j<M; j++) {
    				matrix[i][j] = Integer.parseInt(st.nextToken());
    			}
    		}
    		rotateData = new int[T][3];
    		for (int i=0; i<T; i++) {
    			st = new StringTokenizer(br.readLine(), " ");
    			rotateData[i][0] = Integer.parseInt(st.nextToken());
    			rotateData[i][1] = Integer.parseInt(st.nextToken());
    			rotateData[i][2] = Integer.parseInt(st.nextToken());
    		}
    
    		for (int t=0; t<T; t++) {
    			x = rotateData[t][0];
    			d = rotateData[t][1];
    			k = rotateData[t][2];
    			for (int num=1; num<N+1; num++) {
    				if (num % x == 0) {
    					rotate(num-1, d, k);
    				}
    			}
    			if (!check()) {
    				calculate(0);
    			}					
    		}
    		
    		for (int i=0; i<N; i++) {
    			for (int j=0; j<M; j++) {
    				if (matrix[i][j] > 0) {
    					result += matrix[i][j];
    				}
    			}
    		}
    		System.out.println(result);
    
    	}
    
    }