题解:B3940 [GESP样题 四级] 填幻方

· · 题解

纯模拟:

第一步:

把一填进第一行中央:

int x=0,y=n/2;
a[x][y]=1;

第二步:

需要变横、纵坐标:

int tx=(x+n-1)%n;//上次填数位置横轴变化
int ty=(y+1)%n;//上次填数位置纵轴变化

第三步:

第二步填数失败:

tx=(x+1)%n;//上次填数位置横轴变化
ty=y;//上次填数位置纵轴不变

最后:

结合代码:


#include<bits/stdc++.h>
using namespace std;
int n;
int a[25][25];
int main(){
    cin>>n;//输入
    int x=0,y=n/2;//初始坐标
    a[x][y]=1;//第一步操作:第一行中间填1
    for(int cnt=2;cnt<=n*n;cnt++){//重复第二步和第三步操作
        int tx=(x+n-1)%n;//上次填数位置横轴变化
        int ty=(y+1)%n;//上次填数位置纵轴变化
        if(a[tx][ty]==0){//第二步填数成功
            a[tx][ty]=cnt;//填数
        }else{//第二步没成功做第三步操作
            tx=(x+1)%n;//上次填数位置横轴变化
            ty=y;//上次填数位置纵轴不变
            a[tx][y]=cnt;//填数
        }
        x=tx;//更新横轴
        y=ty;//更新纵轴
    }
    for(int i=0;i<n;i++){//输出
        for(int j=0;j<n;j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;//结束
}