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