AcWing 3174. 回転
画像の回転は、画像を処理する最も簡単な方法の 1 つです。この問題では、画像を時計回りに 9090 度回転させる必要があります。
n×mn×m の 2 次元配列を使用して画像を表現します。たとえば、3×43×4 画像の例を以下に示します。
1 3 5 7
9 8 7 6
3 5 9 7
画像を時計回りに 9090 度回転させた後の画像は次のとおりです。
3 9 1
5 8 3
9 7 5
7 6 7
初期イメージを指定して、回転したイメージを計算します。
入力フォーマット
入力の最初の行には、それぞれ行と列の数を表す 2 つの整数 nn と mm が含まれています。
次の nn 行は、それぞれ mm 整数で、指定された画像を表します。画像の各要素 (ピクセル) は、00 から 255255 までの値を持つ整数です。
出力フォーマット
回転したイメージを表す mm 行と nn 列を出力します。
データ範囲
1≦n,m≦1001≦n,m≦100
入力サンプル:
3 4
1 3 5 7
9 8 7 6
3 5 9 7
出力例:
3 9 1
5 8 3
9 7 5
7 6 7
#include <iostream>
using namespace std;
const int N = 110;
int a[N][N];
int n,m;
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i ++ )
for(int j = 0; j < m; j ++ )
cin >> a[i][j];
for(int j = 0; j < m; j ++ )
{
for(int i = n - 1; i >= 0; i -- )
cout << a[i][j] << ' ';
cout << endl;
}
return 0;
}
LeetCode 73. 行列のゼロ化
与えられた mxn 行列で、要素が 0 の場合、その行と列のすべての要素を 0 に設定します。インプレースアルゴリズムを使用してください。
高度:
直感的な解決策は O(mn) 余分なスペースを使用することですが、それは良い解決策ではありません。
簡単な改善は O(m + n) 余分なスペースを使用することですが、これはまだ最善の解決策ではありません。
一定のスペースのみを使用するソリューションを思いつくことができますか?
例 1:
入力: 行列 = [[1,1,1],[1,0,1],[1,1,1]]
出力: [[1,0,1],[0,0,0],[1 ,0,1]]
例 2:
入力: 行列 = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
出力: [[0,0,0,0],[0 ,4,5,0],[0,3,1,0]]
ヒント:
m == 行列.長さ
n == 行列[0].長さ
1 <= m、n <= 200
-231 <= 行列[i][j] <= 231 - 1
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int col = 1, row = 1;
int n = matrix.size(), m = matrix[0].size();
for(int i = 0; i < n; i ++ )
if(matrix[i][0] == 0) col = 0;
for(int i = 0; i < m; i ++ )
if(matrix[0][i] == 0) row = 0;
for(int i = 1; i < n; i ++ )
{
for(int j = 1; j < m; j ++ )
{
if(matrix[i][j] == 0)
{
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(int i = 1; i < n; i ++ )
if(matrix[i][0] == 0)
{
for(int j = 1 ; j < m; j ++ )
matrix[i][j] = 0;
}
for(int j = 1; j < m; j ++ )
if(matrix[0][j] == 0)
{
for(int i = 1; i < n; i ++ )
matrix[i][j] = 0;
}
if(!col)
for(int i = 0; i < n; i ++ )
matrix[i][0] = 0;
if(!row)
for(int j = 0; j < m; j ++ )
matrix[0][j] = 0;
}
};