[プログラマ]回転マトリクスの枠線


[program]转移马特里克斯的框架线


1.質問


行x columnsサイズのマトリクス.行列の数字は1からrows x columnsの順に1行です.この行列で長方形の範囲を複数回選択し、枠線部分の数値を時計回りに回転させます.各回転は4つの整数(x 1、y 1、x 2、y 2)で表され、その意味は以下の通りである.
  • x 1行y 1列からx 2行y 2列に対応する領域の矩形では、枠の数字を時計回りに回転させる.
  • 次に、6 x 6サイズマトリクスの例を示します.

    この行列に回転(2,2,5,4)を適用すると、領域の枠線が時計回りに回転し、下図のように2行2列から5行4列になります.このとき、中央に15と21がある領域を回転させないように注意しましょう.

    行列の縦長(行数)行、横長(列数)列、および回転リストをクエリーする場合は、各回転を配列に適用し、回転位置によって変更された数値の最小値を配列に順番に戻して解く関数を完了します.

    2.制限

  • 行は2または100以下の自然数です.
  • 列は2以上100以下の自然数です.
  • が始まると、行列には1から1までの横方向の数字が増えていると書かれています.
  • 、すなわち、回転がない場合、i行j列の数字は(i-1)x columns+jとなる.
  • クエリのロー数(回転数)は10000より大きい.
  • クエリの各ローは、4つの整数[x 1、y 1、x 2、y 2]である.
  • x 1行のy 1列からx 2行のy 2列まで時計回りに領域の枠を回転させる.
  • 1≦x 1すべての回転は順番に行われます.
  • 例えば、2番目の回転の答えは、1番目の回転を実行し、その状態で2番目の回転を実行したときに、移動する数字の最大値を求めることである.

    3.解答

    하나하나 회전해주었다.
  • 最大寸法100X100の2次元アレイを作成します.
  • の2次元配列では、rowscolsの大きさに従って配列を初期化する.
  • アレイを回転および回転するときに、answerアレイに変更値の最大値を入れます.
  • のすべての回転が終了すると、answerの配列に戻ります.
  • 4.最初のコードと異なる点

  • 頭を使うとtempの値1つで回転できると思っていたのですが、うまくいかずに3つのtempの値で解題して1つの解題方法を思いつき修正しました.
  • はすべて解けたようですが、いつも開けられず、初期化配列のコードを改めて修正して合格しました.심지어 친절하게 설명도 해줬는데... 3~11번 테스트 케이스를 통과하지 못하는 사람이 많던데 배열 초기화 부분도 잘 보길 바란다.
  • arr[i][j] = (i * rows) + (j + 1) -> arr[i][j] = (i * cols) + (j + 1)
  • 5.コード

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    int arr[100][100];
    
    int rotateArr(int x1, int y1, int x2, int y2) {
        int minValue = arr[x1][y1];
        int temp = arr[x1][y1];
    
        for(int i = x1; i<x2; ++i) {
            arr[i][y1] = arr[i+1][y1];
            minValue = min(minValue, arr[i][y1]);
        }
        for(int i = y1; i<y2; ++i) {
            arr[x2][i] = arr[x2][i+1];
            minValue = min(minValue, arr[x2][i]);
        }
        
        for(int i = x2; i>x1; --i) {
            arr[i][y2] = arr[i-1][y2];
            minValue = min(minValue, arr[i][y2]);
        }
    
        for(int i=y2; i>y1+1; --i) {
            arr[x1][i] = arr[x1][i-1];
            minValue = min(minValue, arr[x1][i]);
        }
        arr[x1][y1+1] = temp;
        return minValue;
    }
    
    vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
        vector<int> answer;
        for(int i=0; i<rows; ++i){
            for(int j=0; j<columns; ++j){
                arr[i][j] = (columns * i) + (j + 1);
            }
        }
        
        for(int i = 0; i<queries.size(); ++i){
            answer.push_back(
                rotateArr(
                    queries[i][0]-1,
                    queries[i][1]-1,
                    queries[i][2]-1,
                    queries[i][3]-1
                )
            );
        }
        return answer;
    }