《算法设计与分析》:构造螺旋阵

螺旋阵:任意给定n*n值,按如下螺旋的方式输出方阵: n=3    输出:   1    8   7 2    9   6 3    4   5 n=4    输出:  1    12  11  10 2    13  16  9 3    14  15  8 4    5    6    7 思路: 1) 引入变量k,表示在某一方向的上数据的个数,k的初值是n 2) 每当数据存放到左下角时,k减1 3) 存放到右上角时,k再减1 4) 引入符号变量t,初值为+1,表示处理前半圈:左侧i向下变大,j向右变大 5) t变为-1:表示处理后半圈:右侧i向上变小,j向左变小 6) 于是一圈内下标的变化情况如下: j=1   i=i+t  1----n       k=n i=n   j=j+t  2----n      前半圈共2*k-1个 t= -t              k=k-1 j=n   i=i+t   n-1----1 i=1   j=j+t   n-1----2    后半圈共2*k-1个 t= -t                k=k-1 7) 用x模拟“摆放”的数据;用y(1~2*k-1)作循环变量,模拟半圈内数据的处理的过程。 8) 引入b[0]表示数组的行下标,b[1]表示数组的列下表,前半圈y<=k,y/(k+1)=0,后半圈,y/(k+1)=1,则b[y/(k+1)]=b[y/(k+1)]+t可代表半圈下标的变化   代码:  
#include 
#include 
using namespace std;
int main(){
    int a[10][10];
    int n;
    scanf("%d",&n);
    memset(a, 0, sizeof(a));
    int x = 1;
    int t = 1;
    int k = n;
    int b[2] = {0, 1};
    while(x <= n * n){
        for (int y = 1; y <= 2*k-1; y ++){
            b[y/(k+1)] = b[y/(k+1)] + t;
            a[b[0]][b[1]] = x ++;
        }
        k --,   t = -1 * t;
    }
    for (int i = 1; i <= n; i ++){
        for (int j = 1; j <= n - 1; j ++){
            printf("%d ",a[i][j]);
        }
        printf("%d\n",a[i][n]);
    }
    return 0;
}
 
举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
原文地址:https://www.cnblogs.com/AbandonZHANG/p/4114191.html