hdu1998

/*
分析:
    水题,就是发现一个规律:
以每行l=n/2为中心,向两边延伸:向左下角就减1、向右上角就加1。而需要向左下角
进行的数量是随着行号递增的,一次增加1,初始为0。


注意left_temp是从-1开始的,因为我的代码在全图处理的时候,将l=n/2处的数据也处理了
一下。但是写代码的时候忘了,还是让left_temp从0开始了。以后写代码的时候,如果哪点儿用
了和平常不一样的方法,记录一下下,省的前面考虑了、后面给忘了(这种错误犯了好多次了

- -III)。

 还是细节决定成败吧。

                                                                     2012-04-11
*/








#include"stdio.h"
#include"string.h"
int main()
{
int T;
int n;
int num[19][19];
int k,i,l;
int left;
int temp;
int left_temp;
scanf("%d",&T);
while(T--)
{
memset(num,0,sizeof(num));
scanf("%d",&n);
for(i=0;i<n;i++)
num[i][n/2]=1+i*(n+1);


for(k=left=0;k<n;k++,left++)
{
//处理右上角
temp=num[k][n/2];
for(left_temp=-1,i=k,l=n/2;left_temp<n-1-left;i--,l++,left_temp++)
{
if(i<0)
i=n-1;
if(l>=n)
l=0;
num[i][l]=temp;
temp++;
}
//处理左下角
temp=num[k][n/2];
for(left_temp=-1,i=k,l=n/2;left_temp<left;i++,l--,left_temp++)
{
if(i>=n)
i=0;
if(l<0)
l=n-1;
num[i][l]=temp;
temp--;
}
}


for(i=0;i<n;i++)
{
for(l=0;l<n;l++)
printf("%4d",num[i][l]);
printf("\n");
}
}
return 0;
}

你可能感兴趣的:(hdu1998)