/*
有许多算法问题是关于数字方阵的,多数通用的算法是计算规律和数据并排着输出
而本例是用直接写屏方法输出,它的方法不再是计算数据与规律,而是计算数据位置,"跳"着输出数据
最近很忙,因此算法思想就不写了,大家自己领悟:)
以下是用直接写屏的方法输出有规律的数字方阵的一些例子
Write By S.K
*/
/* 写屏添数法 一
输出字轮转组成一正方形,已n作为边长,比如:
n=4:
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
n=5:
1 16 15 14 13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5 6 7 8 9
*/
/*Write By S.K*/
#include"stdio.h"
int main(void)
{
int n,i,k,s=0,z=1,x=1,y=1;
scanf("%d",&n);
for(i=0;i<2*n-1;i++)
{
for(k=0;k<n-1-s;k++)
{
gotoxy(x*3,y);
printf("%d",z);
z++;
switch(i%4)
{
case 0: y++; break;
case 1: x++; break;
case 2: y--; break;
case 3: x--;
}
}
if(i%4==3) { x++; y++; s+=2;}
}
gotoxy(x*3,y);
printf("%d",z);
getch();
}
/*写屏添数法 二
写屏输出如下数字排列:
n=3:
1 2 6
3 5 7
4 8 9
n=4:
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
n=5:
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
n=6:
1 2 6 7 15 16
3 5 8 14 17 26
4 9 13 18 25 27
10 12 19 24 28 33
11 20 23 29 32 34
21 22 30 31 35 36
.......
读入n,输出数字方阵
*/
/*Write By S.K*/
#include<stdio.h>
#include<math.h>
int main(void)
{
int n,i,k,w=1,v=1,t=1,e=1,f;
scanf("%d",&n);
f=n;
n=n*n/2;
for(i=1;i<=f;i++)
{
if(e>n) break;
(i%2) ? w=1,v=t : (w=t,v=1);
for(k=1;k<=t;k++)
{
gotoxy(w*3,v);
printf("%d",e);
gotoxy((f-w+1)*3,f-v+1);
printf("%d",n*2-e+1+f%2);
e++;
if(e>n) break;
(i%2) ? w++,v-- : (w--,v++);
}
t++;
}
if(f%2)
{
gotoxy((f/2+1)*3,f/2+1);
printf("%d",n+1);
}
getch();
}