一、《信息学奥赛一本通》
提高组初赛模拟试题(十)
四、完善程序
1.奇数幻方
#include<iostream>
#include<iomanip>
using namespace std;
int a[20][20];
void ArrangeMagicMatrix(int M){
int row=1,col=M/2+1;
a[row][col]=1;
for(int i=2;i<=M*M;i++){
if((i-1)%M==0)row=row+1;
else{
if(row==1)row=M;else row--;
if(col==M)col=1;else col++;
}
a[row][col]=i;
}
}
void print(int M){
for(int row=1;row<=M;row++){
for(int col=1;col<=M;col++)
cout<<setw(5)<<a[row][col];
cout<<endl;
}
cout<<(1+M*M)*M/2<<endl;
}
int main(){
int n;
cin>>n;
ArrangeMagicMatrix(n);
print(n);
return 0;
}
当输入5
时,运行结果:
65
为每行每列相等的和
二、洛谷 P2615 神奇的幻方
#include<iostream>
#include<cstdio>
using namespace std;
int n,k,i;
int a[40][40];
int p[1600],q[1600];//p行 q列,记录位置
int main(){
cin>>n;
a[1][n/2+1]=1;
p[1]=1;
q[1]=n/2+1;
for(k=2;k<=n*n;k++){
if(p[k-1]==1 && q[k-1]!=n){
p[k]=n;
q[k]=q[k-1]+1;//cout<<1; 调试用
}
else if(p[k-1]!=1 && q[k-1]==n){
p[k]=p[k-1]-1;
q[k]=1;//cout<<2;
}
else if(p[k-1]==1 && q[k-1]==n){
p[k]=p[k-1]+1;
q[k]=q[k-1];//cout<<3;
}
else{
if(a[p[k-1]-1][q[k-1]+1]==0){
p[k]=p[k-1]-1;
q[k]=q[k-1]+1;//cout<<4;
}
else{
p[k]=p[k-1]+1;
q[k]=q[k-1];//cout<<5;
}
}
a[p[k]][q[k]]=k;
// cout<<6;
// printf("p%d = %d q%d =%d",k,p[k],k,q[k]);
}
for(k=1;k<=n;k++){
for(i=1;i<=n;i++)
cout<<a[k][i]<<" ";
cout<<endl;
}
return 0;