目录
一、旋转图像
翻转
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for(int i = 0; i < n /2; i++){
for(int j = 0; j < n; j++){
swap(matrix[i][j], matrix[n - i - 1][j]);
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < i; j++){
swap(matrix[i][j], matrix[j][i]);
}
}
}
};
原地旋转
通过观察矩阵,可以看出只要一次性旋转四个数便可以完成原地旋转,其过程可以确保不遗漏且不重复。
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for(int i = 0; i < n / 2; i++){
for(int j = 0; j < (n + 1) / 2; j++){
int tmp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = tmp;
}
}
}
};
二、判断矩阵经轮转后是否一致
原地旋转比较
转动三次依次比较
class Solution {
public:
bool findRotation(vector<vector<int>>& mat, vector<vector<int>>& target) {
int n = mat.size();
if(mat == target)
return true;
for(int i = 0; i < 3; i++){
for(int i = 0; i < n / 2; i++){
for(int j = 0; j < (n + 1) / 2; j++){
int tmp = mat[i][j];
mat[i][j] = mat[n - j - 1][i];
mat[n - j - 1][i] = mat[n - i - 1][n - j - 1];
mat[n - i - 1][n - j - 1] = mat[j][n - i - 1];
mat[j][n - i - 1] = tmp;
}
}
if(mat == target)
return true;
}
return false;
}
};
坐标转换比较
转度数 原坐标 转换坐标
90° [x, y] -> [y, n - x - 1]
180° [x, y] -> [n - x - 1, n - y - 1]
270° [x, y] -> [n - y - 1, x]
class Solution {
public:
bool findRotation(vector<vector<int>>& mat, vector<vector<int>>& target) {
int n = mat.size();
if(mat == target)
return true;
int flag = 1;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(mat[i][j] != target[j][n - i - 1]){
flag = 0;
break;
}
}
}
if(flag == 1)
return true;
else{
flag = 1;
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(mat[i][j] != target[n - i - 1][n - j - 1]){
flag = 0;
break;
}
}
}
if(flag == 1)
return true;
else{
flag = 1;
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(mat[i][j] != target[n - j - 1][i]){
flag = 0;
break;
}
}
}
if(flag == 1)
return true;
else{
flag = 1;
}
return false;
}
};