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


回答日:2021年-08-12

質問する


質問リンク:https://programmers.co.kr/learn/courses/30/lessons/77485

アクセスと解析


指定された座標を2つの頂点として長方形を描く場合、長方形の4つのエッジが通る座標を基準にして、時計回りに1つの値を1つずつ移動します.
長方形の右上隅の値(x 1,y 2)を格納し、上、左、下、右の順に時計回りに1マス移動し、最後に保存した値を代入する(x 1+1,y 2).

コード#コード#

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    
    int arr[101][101];
    int num = 1;
    for (int i = 1; i <= rows; i++) {
        for (int j = 1; j <= columns; j++) {
            arr[i][j] = num++;
        }
    }
    
    for (auto q : queries) {
        int x1 = q[0], y1 = q[1], x2 = q[2], y2 = q[3];
        
        int corner = arr[x1][y2];
        int ret = corner;
        for (int i = y2; i > y1; i--) {
            arr[x1][i] = arr[x1][i - 1];
            ret = min(ret, arr[x1][i]);
        }
        for (int i = x1; i < x2; i++) {
            arr[i][y1] = arr[i + 1][y1];
            ret = min(ret, arr[i][y1]);
        }
        for (int i = y1; i < y2; i++) {
            arr[x2][i] = arr[x2][i + 1];
            ret = min(ret, arr[x2][i]);
        }
        for (int i = x2; i > x1 + 1; i--) {
            arr[i][y2] = arr[i - 1][y2];
            ret = min(ret, arr[i][y2]);
        }
        arr[x1 + 1][y2] = corner;
        answer.push_back(ret);
    }
    return answer;
}

結果



フィードバック


これは間違いやすい問題で、インデックスの配置をよく考えるべきです.