1 2 3
8 9 4
7 6 5
给定一个数字N,求出如图所示的一个表格,输出。
#include <stdio.h>
#include <stdlib.h>
int get_q(int x,int y,int n)
{
int min = 9999999L;
if(x<min) min=x;
if(y<min) min=y;
if((n-x-1)<min) min=n-x-1;
if((n-y-1)<min) min=n-y-1;
return min;
}
//获取第q全之前的全部编号
int get_b(int q,int n)
{
return 2*q*(2*n-2*q);
}
//获取
int get_i(int x,int y,int n,int q)
{
if(x==q)
return (y-x+1);
if(y==(n-q-1))
return (n-q-q-1)*1+x-q+1;
if(x==(n-q-1))
return (n-q-q-1)*2+n-q-y;
if(y==q)
return (n-q-q-1)*3+n-q-x;
}
int get_x_y(int x,int y,int n)
{
int q=get_q(x,y,n);
return get_b(q,n)+get_i(x,y,n,q);
}
int main()
{
int n;
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%5d",get_x_y(i,j,n));
printf("\n");
}
return 0;
}
不需要新建数组的算法,时间复杂度O(N^2),空间复杂度O(1)。
算法思路:
直接求在n的情况下,数组F[X][Y]所对应的值。先求X,Y坐标所在的圈数。根据圈数R,算出第R圈之前的全部数字有多少个。
第二部,计算该坐标在第R圈的第几个,那么这个坐标的值就是R圈之前的数字个数+在第R圈的第几个。