輸入一個奇數n,打印出一個n*n的矩陣,每個數字是從1到n*n的整數,要使每一行,每一列的數字之和都相等
阿新 • • 發佈:2019-02-08
#include<stdio.h>
int a[1000][1000];
int main()
{
int n,i,j;
scanf("%d",&n);
a[0][n/2]=1;
for(i=0;i>n;i++){
for(j=0;j<n;j++){
a[i][j]=0;
}
}
int h,l;
h=0;
l=n/2;
for(i=2;i<=n*n;i++){
if((h-1+n)%n>=0&&(l+1+n)%n>=0&&a[(h-1+n)%n][(l+1+n)%n]==0){
a[(h-1+n)%n][(l+1+n)%n]=i;
h=(h-1+n)%n;
l=(l+1+n)%n;
}
else if((h+1+n)%n>=0&&a[(h+1+n)%n][l]==0){
h=(h+1+n)%n;
a[h][l]=i;
}
else if((h+1+n)%n>=0&&(l+1+n)%n>=0&&a[(h+1+n)%n][(l+1+n)%n]==0)
{
h=(h-1+n)%n;
l=(l-1+n)%n;
a[h][l]=i;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
int a[1000][1000];
int main()
{
int n,i,j;
scanf("%d",&n);
a[0][n/2]=1;
for(i=0;i>n;i++){
for(j=0;j<n;j++){
a[i][j]=0;
}
}
int h,l;
h=0;
l=n/2;
for(i=2;i<=n*n;i++){
if((h-1+n)%n>=0&&(l+1+n)%n>=0&&a[(h-1+n)%n][(l+1+n)%n]==0){
a[(h-1+n)%n][(l+1+n)%n]=i;
h=(h-1+n)%n;
l=(l+1+n)%n;
}
else if((h+1+n)%n>=0&&a[(h+1+n)%n][l]==0){
h=(h+1+n)%n;
a[h][l]=i;
}
else if((h+1+n)%n>=0&&(l+1+n)%n>=0&&a[(h+1+n)%n][(l+1+n)%n]==0)
{
h=(h-1+n)%n;
l=(l-1+n)%n;
a[h][l]=i;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
要考慮三個方向,並且要按先後考慮
1:當前位置的斜上方
2:(若前一方向不行)當前方向的正下方
3:(若前一方向不行)當前方向的左上方
要注意的是雖然矩陣是n*n的,但是想的時候要把矩陣擴充套件,這就是(h-1+n)%n之類的原因