螺旋阵:任意给定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;}