c++ - 如何在 C++ 中制作数字顺时针旋转的二维数组?

标签 c++ multidimensional-array

<分区>

我需要在 C++ 中创建一个顺时针旋转的二维数组,如下所示:

789
612
543

问题是我没有找到一个好的算法。

我每次都尝试更改 x 和 y 并更改索引,但我应该如何更改 xy

例如我试过:

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

关于c++ - 如何在 C++ 中制作数字顺时针旋转的二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23821661/

相关文章:

c++ - 注释变量与 Doxygen 内联会带来任何惩罚吗?

c++ - 即使包含库,g++ 也会提示 undefined reference

c++ - 如何让 VS Code 在调试时不打开终端?

php - PHP 中的多维数组计数

mysql - 如何插入没有特定顺序的数据?

java - 交换数组中的值

javascript - 从用户输入的2个数组中查找最大数字

c++ - 通过 typedefs 消除歧义是 C++ 中的非标准行为吗?

java - 需要帮助按第二个元素然后按第一个元素对二维数组进行排序(Java)

c++ - 如何初始化正则表达式 vector ?