N*Nマトリクス回転問題(時計回り、反時計回り)
1548 ワード
方法1:
マトリクス回転については、ブロック化することができ、具体的には、上、下、左、右の4つの部分に分けることができる.例えば、時計回りに90度回転させる場合は、まず上の部分を保存しておいて、左の部分を上の部分に割り当て(このとき上の部分にはバックアップが残っている)、下の部分を左の部分に割り当て、右の部分を下の部分に割り当て、保存した上の部分のバックアップを右の部分に割り当てます.簡単に言えば、左-->上、下-->左、右-->下、保存-->右.
反時計回りに回転するのは、時計回りに3回回転する、すなわち3回回転行列を呼び出す関数として理解できる.の
方法2:(反時計回り)(同理は時計回り)
マトリクス回転については、ブロック化することができ、具体的には、上、下、左、右の4つの部分に分けることができる.例えば、時計回りに90度回転させる場合は、まず上の部分を保存しておいて、左の部分を上の部分に割り当て(このとき上の部分にはバックアップが残っている)、下の部分を左の部分に割り当て、右の部分を下の部分に割り当て、保存した上の部分のバックアップを右の部分に割り当てます.簡単に言えば、左-->上、下-->左、右-->下、保存-->右.
// :a[first][i]
// :a[last][last-offset]
// :a[last-offset][first]
// :a[i][last]
#include
#include//setw(int n) .cout< top
a[last-offset][first]=a[last][last-offset];// button -> left
a[last][last-offset]=a[i][last]; //right -> button
a[i][last]=top;//top -> right
}
}
}
int main()
{
int a[N][N],i,j,(*p)[N];
p=a;
// a[][]
for(i=0;i
反時計回りに回転するのは、時計回りに3回回転する、すなわち3回回転行列を呼び出す関数として理解できる.の
方法2:(反時計回り)(同理は時計回り)
#include
#include
#define N 3
using namespace std;
// 90
void rotate(int data[N][N]) {
int tmp[N][N] = {0};//
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
tmp[i][j] = data[j][N - 1 - i];// tmp[i][j]=data[N-1-j][i]
}
}
//
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
data[i][j] = tmp[i][j];
}
}
}
int main(){
int data[N][N]={0};
int (*p)[N];
p=data;
//
for(int i=0;i