问题描述:
输入一个数字n,使1~n*n数字填充在n阶矩阵中,使n阶矩阵水平、竖直、对角线数字相加之和相同;
eg:输入3,输出3阶矩阵
解决思想:
*题目要求n为奇数 *
1.首先数字1放在第一排中间:(n+1)/2
2.如果数字在第一行但是不在最后一列,则它下一个元素放在
上一个元素 下一列的最后一行
3.如果数字在最后一列但是不在第一行,则下一个元素放在其上一行的第一列
4.如果数字在第一行且在最后一列,则下一个元素放在其正下方
5.如果数字不在第一行也不在最后一列,则看其右上方是否有元素
,如果没有,则放其右上角;如果有,则放其正下方;
6.左对齐站位输出
cout<<std::left<<setw(3)<<a[i][j];
AC代码(c++):
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[n+1][n+1];
memset(a,0,sizeof(a)); //初始化数组为0
int x=1,y=(n+1)/2; // 存储位置
int cnt=1; //填充数值、记录循环次数
a[x][y]=cnt++;
while(cnt<=n*n){
if(x==1&&y!=n){
x=n;
y=y+1;
a[x][y]=cnt++;
}
else if(x!=1&&y==n){
x=x-1;
y=1;
a[x][y]=cnt++;
}
else if(x==1&&y==n){
x=x+1;
y=y;
a[x][y]=cnt++;
}
else{
if(a[x-1][y+1]>0){
x=x+1;
y=y;
a[x][y]=cnt++;
}
else{
x=x-1;
y=y+1;
a[x][y]=cnt++;
}
}
}
//打印输出
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
//左对齐站位输出
cout<<std::left<<setw(3)<<a[i][j];
}
cout<<endl;
}
return 0;
}