一、把填数等价为点的移动,先下到底,再左到底,再上到底,再右到底。循环往复,直到移动步数sum==n*n;
其实点的移动判断可以等价为先“虚拟移动” nx,ny,再判断nx,ny是否合法
二是、贴代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int a[100][100];
int main()
{
int n;
scanf("%d",&n);
int end=n-1;
int start=0;
int sum=0;
while(start<=end)
{
int i,j;
for(j=end,i=start;i<=end;i++)
{
sum++;
a[i][j]=sum;
}
for(i=end,j=end-1;j>=start;j--)
{
sum++;
a[i][j]=sum;
}
for(j=start,i=end-1;i>=start;i--)
{
sum++;
a[i][j]=sum;
}
for(i=start,j=start+1;j<=end-1;j++)
{
sum++;
a[i][j]=sum;
}
start++;
end--;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%3d ",a[i][j]);
}
printf("\n");
}
}