//写一个蛇型二维数组
/*
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
//写一个蛇型数组
/*
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
*/
//书写思路: 利用二维数组,一圈是四个边,仅需要记录每个边的起始坐标,和终点坐标,就可以用循环分别遍历四条边,进行赋值。
//代码逻辑:
#include<stdio.h>
#define N 6 //定义一个六行六列的数组
int main()
{
int arr[N][N] = {0};//定义一个二维行列式
int x1 = 0, y1 = 0;//起点坐标
int x2 = 0, y2 = 0;//终点坐标
int num = 1;//起始数 1-36 /6*6=36 //一共三圈
int n = 0;//表示表示每一圈起始的坐标点 第一圈0,0,第二圈1,1,第三圈2.2
//上边设置代码:
while (1)
{
x1 = n, y1 = n;//起点坐标0.0
x2 = x1, y2 = N - 1 - n;//终点坐标N是数组行数,比如第一行结束;(0,6-1-0)坐标(0,5)
//设置上行
int i = x1, j = y1;
for (j = y1; j <= y2; j++)//注意:表达式3完了后j++为6
arr[x1][j] = num++;//i是x1行不变,j向左随着num自增
//右边设置代码 6往下为7
//起点坐标
x1 = n + 1, y1 = j - 1; //也就是坐标(1,6-1)==(1,5)也就是7的坐标
x2 = N - 1 - n, y2 = y1;//终点坐标
for (i = x1; i <= x2; i++)
arr[i][y1] = num++;//保持列不变,让行随num自增
//底边//同理 结束时上面有x1=i=6(表达式3中i++已经执行了)
x1 = j - 1, y1 = y1 - 1; //运用码的相似性很快写出12的坐标(6-1,5-1)=(5,4)
x2 = x1, y2 = n;
for (j = y1; j >= y2; j--)
arr[x1][j] = num++;
//左
x1 = x1 - 1, y1 = n;
x2 = n + 1, y2 = y1;//规律取决于n
for (i = x1; i >= x2; i--)
arr[i][y1] = num++;
if (num > N * N) break;//用num<36循环来限制循环
n++;
}
int i, j;
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf(" %3d", arr[i][j]);//设置多次打印
putchar('\n');//每一行换行,注意这是一个字符要用''号
}
return 0;
}