题目链接:P2615
题目描述
幻方是一种很神奇的 N*N
矩阵:它由数字 1,2,3,⋯⋯,N×N
构成,且每行、每列及两条对角线上的数字之和都相同。
当 N
为奇数时,我们可以通过下方法构建一个幻方:
首先将 1
写在第一行的中间。
之后,按如下方式从小到大依次填写每个数 K(K=2,3,⋯,N×N)
:
- 若
(K-1)
在第一行但不在最后一列,则将K
填在最后一行,(K−1)
所在列的右一列; - 若
(K-1)
在最后一列但不在第一行,则将K
填在第一列,(K−1)
所在行的上一行; - 若
(K-1)
在第一行最后一列,则将K
填在(K−1)
的正下方; - 若
(K-1)
既不在第一行,也不在最后一列,如果(K-1)
的右上方还未填数,则将K
填在(K-1)
的右上方,否则将K
填在(K-1)
的正下方。
现给定 N
,请按上述方法构造 N×N
的幻方。
数据保证N
是奇数
输入输出样例
输入#1:
3
输出#1:
8 1 6
3 5 7
4 9 2
代码实现
定义输入不解释
#include <bits/stdc++.h>
using namespace std;
int cube[105][105];
int main ()
{
int n,x=1,y; //x,y分别表示上一个数的横纵坐标
cin>>n;
y=(n+1)/2;
cube[x][y]=1; //把1放在第1行中间
return 0;
}
主循环,控制幻方生成
for(int i=2;i<=n*n;i++) {
//...模拟代码
}
接下来,模拟第一种情况
if(x==1&&y!=n) { //在第一行但不在最后一列
x=n; //x坐标更新
y=y+1; //y坐标更新
cube[x][y]=i; //赋值
}
模拟第二种情况
else if(x!=1&&y==n) { //在最后一列但不在第一行
x=x-1; //x坐标更新
y=1; //y坐标更新
cube[x][y]=i; //赋值
}
模拟第三种情况
else if(x==1&&y==n) { //在第一行也在最后一列
x=x+1;//x坐标更新
y=y; //y坐标更新
cube[x][y]=i; //赋值
}
模拟第四种情况
else if(x!=1&&y!=n){ //不在第一行,也不在最后一列
if(cube[x-1][y+1]==0) { //右上角空缺
x=x-1; //x坐标更新
y=y+1; //y坐标更新
cube[x][y]=i; //赋值
}
else { //右上角已有数
x=x+1; //坐标更新
cube[x][y]=i; //赋值
}
}
最后,输出!
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
cout<<cube[i][j]<<' ';
}
cout<<endl;
}
整合全部代码如下:
#include <bits/stdc++.h>
using namespace std;
int cube[105][105];
int main ()
{
int n,x=1,y;
cin>>n;
y=(n+1)/2;
cube[x][y]=1;
for(int i=2;i<=n*n;i++) {
if(x==1&&y!=n) {
x=n;
y=y+1;
cube[x][y]=i;
}
else if(x!=1&&y==n) {
x=x-1;
y=1;
cube[x][y]=i;
}
else if(x==1&&y==n) {
x=x+1;
y=y;
cube[x][y]=i;
}
else if(x!=1&&y!=n){
if(cube[x-1][y+1]==0) {
x=x-1;
y=y+1;
cube[x][y]=i;
}
else {
x=x+1;
cube[x][y]=i;
}
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
cout<<cube[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
每日一问 问题:为什么第二个模拟语句前要加else
?
答案:不加会导致下一次循环时的误判
这题作为2015年NOIP提高组的题目,真是太水了,用模拟轻松通过😁
还有一种方法…
#include <bits/stdc++.h>
using namespace std;
int cube[105][105];
int main ()
{
int n,x=1,y;
cin>>n;
y=(n+1)/2;
cube[x][y]=1;
for(int i=2;i<=n*n;i++) {
if(x==1&&y!=n) {
x=n;
y=y+1;
cube[x][y]=i;
continue;
}
if(x!=1&&y==n) {
x=x-1;
y=1;
cube[x][y]=i;
continue;
}
if(x==1&&y==n) {
x=x+1;
y=y;
cube[x][y]=i;
continue;
}
if(x!=1&&y!=n){
if(cube[x-1][y+1]==0) {
x=x-1;
y=y+1;
cube[x][y]=i;
continue;
}
else {
x=x+1;
cube[x][y]=i;
continue;
}
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
cout<<cube[i][j]<<' ';
}
cout<<endl;
}
return 0;
}