1.蛇形方阵:
1 2 3
6 5 4
7 8 9
外层控制层数,内层根据列数控制方向:0 则往右走 N-1则往左走
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int a[SIZE][SIZE];
int main(int argc, const char *argv[])
{
int dim = atoi(argv[1]);
int i, j, k, lev;
int num =0;
j = 0;
for(lev = 0; lev < dim; lev++)
{
if(j == 0)
{
while(j < dim)
a[lev][j++] = ++num;
j--;
a[lev+1][j] = num;
}
else if(j == dim-1)
{
while(j >= 0)
a[lev][j--] = ++num;
j++;
a[lev+1][j] = num;
}
}
for(i = 0; i < dim; ++i)
{
for(j = 0; j < dim; ++j)
printf("%-4d", a[i][j]);
printf("\n");
}
return 0;
}
2.螺旋方阵
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
方法:根据数字或者圈数来控制外层循环,内层循环还是控制四个方向
根据数字:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int a[SIZE][SIZE];//全局变量,数组未初始化,元素为0
int main(int argc, const char *argv[])
{
int dim = atoi(argv[1]);
int x, y, count;
x = y = count = 0;
a[0][0] = 1;
count++;
while(count < dim * dim)
{
while(y < dim - 1 && a[x][y+1] == 0 )
a[x][++y] = ++count;
while(x < dim - 1 && a[x+1][y] == 0)
a[++x][y] = ++count;
while(y > 0 && a[x][y-1] == 0)
a[x][--y] = ++count;
while(x > 0 && a[x-1][y] == 0)
a[--x][y] = ++count;
}
for(x = 0; x < dim; ++x)
{
for(y = 0; y < dim; ++y)
printf("%-4d", a[x][y]);
printf("\n");
}
return 0;
}
根据圈数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int a[SIZE][SIZE];
int main(int argc, const char *argv[])
{
int dim = atoi(argv[1]);
int i,j;
int index_x;
int left_up, right_down;
int circle = dim % 2 ? dim / 2 +1 : dim / 2;
int num = dim*dim +1;
for(index_x = 0; index_x < circle; index_x++)
{
left_up = index_x;//左上角
right_down = dim - left_up -1;//右下角
for(i = left_up, j = left_up; j < right_down; ++j)
a[i][j] = --num;
for(i = left_up, j = right_down; i < right_down; ++i)
a[i][j] = --num;
for(i = right_down, j = right_down; j > left_up; --j)
a[i][j] = --num;
for(i = right_down, j = left_up; i > left_up; --i)
a[i][j] = --num;
}
for(i = 0; i < dim; ++i)
{
for(j = 0; j < dim; ++j)
printf("%-4d", a[i][j]);
printf("\n");
}
return 0;
}