[プログラマ]回転マトリクスの枠線
[program]转移马特里克斯的框架线
1.質問
行x columnsサイズのマトリクス.行列の数字は1からrows x columnsの順に1行です.この行列で長方形の範囲を複数回選択し、枠線部分の数値を時計回りに回転させます.各回転は4つの整数(x 1、y 1、x 2、y 2)で表され、その意味は以下の通りである.
この行列に回転(2,2,5,4)を適用すると、領域の枠線が時計回りに回転し、下図のように2行2列から5行4列になります.このとき、中央に15と21がある領域を回転させないように注意しましょう.
行列の縦長(行数)行、横長(列数)列、および回転リストをクエリーする場合は、各回転を配列に適用し、回転位置によって変更された数値の最小値を配列に順番に戻して解く関数を完了します.
2.制限
3.解答
하나하나 회전해주었다.
100X100
の2次元アレイを作成します.rows
、cols
の大きさに従って配列を初期化する.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;
}
Reference
この問題について([プログラマ]回転マトリクスの枠線), 我々は、より多くの情報をここで見つけました https://velog.io/@e7838752/programmers-rotateMartrixテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol