CodeForces - 710C Magic Odd Square(奇数和幻方构造)

本文探讨了如何构造一个n阶幻方,其中填入从1到n^2的数字,确保每行、每列及两条对角线的数字之和均为奇数。通过巧妙的构造方法,文章提供了一个有效的解决方案,并附带代码实现。

Magic Odd Square

 

Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both main diagonals are odd.

Input

The only line contains odd integer n (1 ≤ n ≤ 49).

Output

Print n lines with n integers. All the integers should be different and from 1 to n2. The sum in each row, column and both main diagonals should be odd.

Examples

Input
1
Output
1
Input
3
Output
2 1 4
3 5 7
6 9 8



题意:构造n阶幻方,填入1~n^2,使每行每列每对角线和为奇数。

思路:暴搜TLE,那么考虑构造。方法见下图,1填奇,0填偶。

0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0 0
0 0 0 1 1 1 1 1 0 0 0
0 0 1 1 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 0 0 0
0 0 0 0 1 1 1 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0


各类幻方构造法(知乎):https://www.zhihu.com/question/30498489/answer/49208033

#include<bits/stdc++.h>
#define MAX 105
using namespace std;
typedef long long ll;

int a[MAX][MAX],b[MAX*MAX];

int main()
{
    int n,i,j,k;
    scanf("%d",&n);
    for(i=1;i<=n/2;i++){
        j=n/2+1-i+1;
        for(k=1;k<=2*i-1;k++){
            a[i][j+k-1]=1;
        }
    }
    for(i=n/2+1;i<=n;i++){
        j=i-(n/2+1)+1;
        for(k=1;k<=n+1-(2*j-1);k++){
            a[i][j+k-1]=1;
        }
    }
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            if(j>1) printf(" ");
            if(a[i][j]){
                for(k=1;k<=n*n;k+=2){
                    if(b[k]) continue;
                    b[k]=1;
                    a[i][j]=k;
                    break;
                }
            }
            else{
                for(k=2;k<=n*n;k+=2){
                    if(b[k]) continue;
                    b[k]=1;
                    a[i][j]=k;
                    break;
                }
            }
            printf("%d",a[i][j]);
        }
        printf("\n");
    }
    return 0;
 } 

 

 

转载于:https://www.cnblogs.com/yzm10/p/10544981.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值