绕中心点顺序旋转的n*n数组

问题

给定一个n,n为奇数,求一个n*n的二维数组,1 位于数组的中心,其它数绕中心点依次旋转并递增,如n=5时,数组如下:

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

思路

示意图.jpg

中心点的坐标为(row,col)=(n/2,n/2),(数组下标均从0开始)。

第1圈:边长side_len=2*1+1=3,从 2开始,先往下走side_len-1 = 2 步,再往左走2步,再往上走2步,最后往右走2步。

第2圈:边长side_len=2*2+1=5,从 10开始,先往下走side_len-1 = 4 步,再往左走4步,再往上走4步,最后往右走4步。

依次类推….直到走完,圈数为circle = n/2 圈。

代码

[cpp]//Problem:绕中心点顺序旋转的二维数组
//Author: JarvisChu
//Blog: zhujiangtao.com
//Date: 2014-3-9

#include <iostream>
#include <iomanip> // setw()

using namespace std;

int main(int argc, char* argv[])
{
const int n = 5; //数组大小,奇数
int data[n][n]; //数组
int num = 1; //起始数字

//中心点坐标,下标从0开始
int row = n/2;
int col = n/2;
cout<<"row,col = "<<row<<" "<<col<<endl;

int circle = n/2; //中心点的外围圈数

//中心点
data[row][col++] = num++;
cout<<"中心点"<<endl<<"data["<<row<<"]["<<col-1<<"]="<<data[row][col-1]<<endl;

//循环计算外围每一圈
for (int i=1;i<=circle;i++)
{
cout<<"第"<<i<<"圈"<<endl;
int side_len = (2*i+1); //圈的边长:3,5,7

cout<<"向下"<<endl;
//向下:长度为side_len
int len = 0;
while(len<(side_len-1))
{
data[row++][col] = num++;
cout<<"data["<<row-1<<"]["<<col<<"]="<<data[row-1][col]<<endl;
len++;
}

cout<<"向左"<<endl;
//向左,长度为side_len -1
row--;col--;//修正起始位置,前一步往下多走了一步,所以row--,下一个位置在左边,所以col++
//如示意图中的虚线所示
len = 0;
while(len<side_len-1)
{
data[row][col--] = num++;
cout<<"data["<<row<<"]["<<col<<"]="<<data[row][col+1]<<endl;
len++;
}

cout<<"向上"<<endl;
//向上,长度为side_len-1
row--;col++;//修正起始位置
len = 0;
while(len<side_len-1)
{
data[row--][col] = num++;
cout<<"data["<<row+1<<"]["<<col<<"]="<<data[row+1][col]<<endl;
len++;
}

cout<<"向右"<<endl;
//向右,长度为side_len -1
row++;col++;//修正起始位置
len = 0;
while(len<side_len-1)
{
data[row][col++] = num++;
cout<<"data["<<row<<"]["<<col-1<<"]="<<data[row][col-1]<<endl;
len++;
}
}

//打印
cout<<"------------------------"<<endl;
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
cout<<setw(3)<<data[i][j];
}
cout<<endl;
}

return 0;
}[/cpp]

作者:JarvisChu
原文链接:绕中心点顺序旋转的n*n数组
版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

发表评论