例如:
9 10 11 12
8 1 2 13
7 0 3 14
6 5 4 15
分析:
N=1 的时候 0
N=2 的时候
1 2
0 3
N=3 的时候
8 1 2
7 0 3
6 5 4
开辟一个二维数组N*N,然后按照螺旋特性填充数组,最后再遍历打印。找到螺旋的中心位置,如果是偶数则,数组下标为i=N/2; j=N/2-1; 然后,每层分两次打印,横着走和竖着走。代码如下:
点击(此处)折叠或打开
-
#include <stdio.h>
-
#include <string.h>
-
#include <stdlib.h>
-
-
void print_array(int **a, int n){
-
int i,j;
-
-
if(n>1){
-
for(i=0; i<n; i++){
-
for(j=0; j<n; j++){
-
printf("%-3d ", a[i][j]);
-
}
-
printf("\n");
-
}
-
}else{
-
printf("0");
-
}
-
printf("\n");
-
-
}
-
-
void print_screw(int n){
-
int i = 0;
-
int sqrtn = n*n;
-
int **arr;
-
int starti, startj;
-
int level;
-
int count;
-
int dir=0;/*0:up, 1:right, 2:down, 3:left*/
-
-
if(n == 0 || n<1 )
-
return ;
-
-
arr = malloc(sizeof(int *)*n);
-
if(!arr)
-
return;
-
for(i=0; i<n; i++){
-
arr[i] = malloc(sizeof(int)*n);
-
if(!arr[i])
-
return ;
-
}
-
-
if(n%2 == 0){
-
starti = n/2;
-
startj = n/2-1;
-
if(startj < 0)
-
startj = 0;
-
}else{
-
starti=startj=(n-1)/2;
-
}
-
-
printf("i=%d j=%d\n", starti, startj);
-
-
arr[starti][startj] = 0;
-
count++;
-
level=1;
-
dir = 0;
-
-
while(count == level*level && count<sqrtn){
-
/*层级往前移动,先附上第一个值*/
-
level++;
-
switch(dir){
-
case 0:
-
starti--;
-
break;
-
case 1:
-
++startj;
-
break;
-
case 2:
-
++starti;
-
break;
-
case 3:
-
--startj;
-
break;
-
}
-
arr[starti][startj]=count;
-
count++;
-
dir=(dir+1)%4;
-
-
/*走两边,一边 level-1个数, 走到level-1个数的时候,需要转换方向*/
-
for(i=0;i<2*(level-1);i++){
-
if(i==(level-1))
-
dir=(dir+1)%4;
-
switch(dir){
-
case 0:
-
starti--;
-
break;
-
case 1:
-
++startj;
-
break;
-
case 2:
-
++starti;
-
break;
-
case 3:
-
--startj;
-
break;
-
}
-
arr[starti][startj] = count;
-
count++;
-
}
-
}
-
-
print_array(arr, n);
-
-
for(i=0; i<n; i++){
-
free(arr[i]);
-
}
-
free(arr);
-
-
}
-
-
int main(int argc, char *argv[]){
-
int n = 0;
-
-
-
if(argc < 2)
-
return 0;
-
-
n = atoi(argv[1]);
-
printf("argc=%d n=%d\n", argc, n);
-
-
print_screw(n);
-
- }