#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<Windows.h>
#include<stdio.h>
#define N 3
void main()
{
int a[N][N] = { 0 };
for (int i = 1; i <= N*N; i++)
{
int m[1000], n[1000];
if (i >= 2)//存放的数从“2”开始的情况
{
if (m[i - 1 - 1] == 0 && n[i - 1 - 1] != N - 1)//当一个数的前一个数位于第一行但不位于n列时
{
m[i - 1] = N - 1;
n[i - 1] = n[i - 1 - 1] + 1;
if (a[m[i - 1]][n[i - 1]] != 0 )//确定的位置已有数
{
m[i - 1] = m[i - 1 - 1-1] + 1;
n[i - 1] = n[i - 1 - 1-1];
a[m[i - 1]][n[i - 1]] = i;
}
else
a[m[i - 1]][n[i - 1]] = i;
}
else if (n[i - 1 - 1] == N - 1 && m[i - 1 - 1] != 0 )//当一个数的前一个数位于第n列,但不位于第1行时
{
m[i - 1] = m[i - 1 - 1] - 1;
n[i - 1] = 0;
if (a[m[i - 1]][n[i - 1]] != 0)
{
m[i - 1] = m[i - 1 - 1 - 1] +1;
n[i - 1] = n[i - 1 - 1 - 1];
a[m[i - 1]][n[i - 1]] = i;
}
else
a[m[i - 1]][n[i - 1]] = i;
}
else if (m[i - 1 - 1] == 0 && n[i - 1 - 1] == N - 1)
{
m[i - 1] = m[i - 1 - 1 ] + 1;
n[i - 1] = n[i - 1 - 1];
a[m[i - 1]][n[i - 1]] = i;
}
else
{
m[i - 1] = m[i - 1 - 1] - 1;
n[i - 1] = n[i - 1 - 1] + 1;
if (a[m[i - 1]][n[i - 1]] != 0)
{
m[i - 1] = m[i - 1 - 1] + 1;
n[i - 1] = n[i - 1 - 1];
a[m[i - 1]][n[i - 1]] = i;
}
else
a[m[i - 1]][n[i - 1]] = i;
}
}
else if (i == 1)//将“1”放在第一行中间一列
{
m[i - 1] = 0;
n[i - 1] = N / 2;
a[m[i - 1]][n[i - 1]] = i;
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
printf("%3d", a[i][j]);
}
printf("\n");
}
system("pause");
}