我需要在 C++ 中创建一个顺时针旋转的二维数组,如下所示:
789
612
543
问题是我没有找到一个好的算法。
我每次都尝试更改 x 和 y 并更改索引,但我应该如何更改 x
和 y
?
例如我试过:
int num[1001][1001];
int n = 1;
int x = 0;
int y = 0;
for (int i = 500; i < 1001 && i >= 0; i++)
{
for (int j = 500; j < 1001 && j >= 0; i++)
{
num[i + x][j + y] = n;
}
}
令 n = 2k + 1
为数组的维度。
设 s
为螺旋数,s=0
为中心 (1)。
然后每个螺旋需要 5 个循环:
iterating from [k+1,k+1+s] to [k+1+s,k+1+s]
from [k+1+s,k+1+s-1] to [k+1+s,k+1-s]
from [k+1+s-1,k+1-s] to [k+1-s,k+1-s]
from [k+1-s,k+1-s+1] to [k+1-s,k+1+s]
from [k+1-s+1,k+1+s] to [k,k+1+s]
我可能在这里犯了一个错误,但总体思路应该有所帮助。
稍后
我已经添加了完整的程序,但这里的螺旋继续与上面给出的索引范围相反。
#include <iostream>
#include <iomanip>
static const int k = 3;
static const int n = 2*k+1;
int a[n][n];
void set(int r, int c, int v){
a[r-1][c-1] = v;
}
void dump(){
for( int r = 0; r < n; r++ ){
for( int c = 0; c < n; c++ ){
std::cout << std::setw( 3 ) << a[r][c];
}
std::cout << std::endl;
}
}
int main(){
int v = 2;
set( k+1,k+1,1);
for( int s = 1; s <= k; s++ ){
for( int r = k+1-s+1; r <= k+1+s; r++ ) set( r, k+1+s, v++ );
for( int c = k+1+s-1; c >= k+1-s; c-- ) set( k+1+s, c, v++ );
for( int r = k+1+s-1; r >= k+1-s; r-- ) set( r, k+1-s, v++ );
for( int c = k+1-s+1; c <= k+1+s; c++ ) set( k+1-s, c, v++ );
}
dump();
//...
在 k 设置为 2 的情况下运行它会产生:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13