一个奇数宫格问题,与大家共勉!
就是横、竖、斜相等#include"stdio.h"
#include"malloc.h"
void main()
{
int n,m,j,*elem;
printf("输入宫格数(奇数):");
scanf("%d",&n);
m=n*n;
elem=(int*)malloc(n*n*sizeof(int));//开辟可以存储宫格数的数组大小
for(int*p=elem;p<elem+m;p++)
*p=0; //将所有的位置放置0
p=elem; //将p指向数组的首地址
j=((n-1)/2)*n; //找到中间的位置
int i=1;
*(p+j)=i++; //中间放置1
while(i<=m) // 循环次数
{
if((j+1)%n == 1 || (j+1)>=2&&(j+1)<=n) //位置是不是宫格的第一行或第一列
{
if((j+1)%n == 1 && j !=0 ) // 位置是不是第一列,但不是第一个位置
{
j=j-1;
*(p+j)=i++;
}
if(j == 0) // 如果是第一个位置则将其位置后移一个,将数值放入其中
{
j=j+1;
*(p+j)=i++;
}
if((j+1)>=2 && (j+1)<=n) // 位置是不是在第一行的第一个到第一行的最后一个
{
j=(n-1)*n+j-1; // 是,就将j转到第n-1行,然后在定位到第n行的j-1列
if(*(p+j) == 0) //看是否j位置是不是有数存入
*(p+j)=i++;
else
{
j=j-(n-1)*n+2; //如果有数,则在原j位置后一个位置存入数
*(p+j)=i++;
}
}
}
else // 位置j不在第一行和第一列,就在j位置的左上方插入数
{
j=j-n-1;
if(*(p+j)==0)
*(p+j)=i++;
else // 如果有数,则在原位置后一个插入数值
{
j=j+n+2;
*(p+j)=i++;
}
}
}//while循环结束
int k=1;
for(p=elem;p<elem+m;p++,k++) //打印输出
{
printf("%-6d",*p);
if(k%n == 0)
printf("\n\n\n");
}
getchar();
getchar();
}