谁能解释一下这是什么现象:
题目:
魔幻方阵
时间限制:0秒 内存限制:0M
题目描述
行数等于列数的矩阵又被称为方阵。现有一个奇数n,要求把1~nn之间(包含1和nn)的正整数变成n行的方阵,并且方阵中的每行,每列和主副对角线上的数字之和都相同。
输入描述
输入一个奇数n,n是正整数,且小于20。
输出描述
输出n行,每行n个正整数,构成这个方阵。
样例
输入
5
输出
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
代码①:
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
int n,i=1,j=(n+1)/2,x,y,box[21][21]={0};
cin>>n;
box[i][j]=1;
for(int a=2;a<=n*n;a++){
if(i==1){
x=n;
}
else{
x=i-1;
}
if(j==n){
y=1;
}
else{
y=j+1;
}
if(box[x][y]==0){
box[x][y]=a;
i=x;
j=y;
}
else{
i++;
box[i][j]=a;
}
}
for(int a=1;a<=n;a++){
for(int b=1;b<=n;b++){
cout<<setw(5)<<box[a][b];
}
cout<<"\n";
}
return 0;
}
结果输出了:
8 15 22 24 6
14 21 23 5 7
20 0 4 11 13
0 3 10 12 19
2 9 16 18 25
改了下i和j定义的位置:
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
int n,x,y,box[21][21]={0};
cin>>n;
int i=1,j=(n+1)/2;
box[i][j]=1;
for(int a=2;a<=n*n;a++){
if(i==1){
x=n;
}
else{
x=i-1;
}
if(j==n){
y=1;
}
else{
y=j+1;
}
if(box[x][y]==0){
box[x][y]=a;
i=x;
j=y;
}
else{
i++;
box[i][j]=a;
}
}
for(int a=1;a<=n;a++){
for(int b=1;b<=n;b++){
cout<<setw(5)<<box[a][b];
}
cout<<"\n";
}
return 0;
}
结果……
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
竟然对了!
谁能解释一下