蛇形填数:
描述
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
-
输入
- 直接输入方陈的维数,即n的值。(n<=100) 输出
- 输出结果是蛇形方陈。
样例输入
3
样例输出
7 8 1
6 9 2
5 4 3
上代码:
#include<stdio.h>
int N[100][100];//定义全局二维数组,存储数据
int count = 1;//count 记录每次填进数组的数字
//填数函数,参数分别为:数组的行号,列号,开始填入的数字(从1开始),数组的大小
void sxts(int k,int h,int count,int size)
{
if(size == 0)//数组大小为 0 * 0 ,即没有要填的,直接返回
return ;
if(size == 1)//数组为数组大小为1 * 1,只需填入一个数
{
N[h][k] = count;
return ;
}
int i = 0;
N[h][k] = count;//填右上角的位置 1;
count ++;//数字加1为下一次填数准备
//填最外层的右边一竖列(相当于size = 3 时 的 2 3)
//此列规律为:列号不变,行号依次增加
for(i = 0; i < size - 1; i ++)
{
h ++;//行号增加
N[h][k] = count;//填入数字
count ++;//为下一次填数准备
}
//填最外一层的下边(相当于size = 3 时 的 4 5)
//此行的规律为:行号不变,列号依次递减
for(i = 0; i < size -1; i ++)
{
k --;
N[h][k] = count;
count ++;
}
//填最外一层的左边一竖列(相当于size = 3 时 的 6 7)
//此行的规律为:列号不变,行号号依次递减
for(i = 0; i < size - 1; i ++)
{
h --;
N[h][k] = count;
count ++;
}
//填最外一层的上边一行(相当于size = 3 时 的 8)
//此行的规律为:列号不变,行号号依次递减,但是注意在填这一行时循环应该为size - 2次,因为此行的最左边和最右边的均被填过
for(i = 0; i < size - 2; i ++)
{
k ++;
N[h][k] = count;
count ++;
}
//递归调用,填下一层
sxts(k,h + 1,count,size - 2);
}
int main()
{
int h,k,n,i,j;
scanf("%d",&n);
k = n - 1; h = 0;
sxts(k,h,count,n);
//打印出数组
for(i = 0; i < n; i ++)
{
for(j = 0; j < n; j ++)
printf("%d ",N[i][j]);
printf("\n");
}
return 0;
}