神奇的幻方

原题链接:https://www.luogu.org/problem/show?pid=2615#sub

题目要求我们生成这个幻方,那么我们只需要模拟一下这个幻方的形成过程就好,非常简单的一道模拟。

AC代码:

 1 #include<iostream>
 2 #define maxn 41
 3 #define check cout << "ok" << endl;
 4 using namespace std;
 5 int a[maxn][maxn];
 6 int n;
 7 int get_hf_line(int x){
 8     int ans = -1;
 9     for (int i=1;i<=n;i++)
10         for (int j=1;j<=n;j++){
11             if (a[i][j] == x)
12                 ans = i;
13         }
14     return ans;
15 }
16
17 int get_hf_column(int x){
18     int ans = -1;
19     for (int i=1;i<=n;i++)
20         for (int j=1;j<=n;j++)
21             if (a[i][j] == x)
22                 ans = j;
23     return ans;
24 }
25
26
27 int main(){
28     cin >> n;
29     int mid = n/2 + 1;
30     a[1][mid] = 1;
31     for (int k=2;k<=n*n;k++){
32         int kx = get_hf_line(k-1);
33         int ky = get_hf_column(k-1);
34
35         //judge
36         if (kx == 1 && ky != n)
37             a[n][ky+1] = k;
38
39         if (ky == n && kx !=1)
40             a[kx-1][1] = k;
41
42         if (a[1][n] == k-1)
43             a[2][n] = k;
44
45         if (kx != 1 && ky != n){
46             if (a[kx-1][ky+1] == 0)
47                 a[kx-1][ky+1] = k;
48             else
49                 a[kx+1][ky] = k;
50         }
51     }
52     for (int i=1;i<=n;i++){
53         for (int j=1;j<=n;j++)
54             printf("%d ",a[i][j]);
55         cout << endl;
56     }
57     return 0;
58 }
时间: 2024-10-31 10:29:26

神奇的幻方的相关文章

2015年 day1.1 神奇的幻方

神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N): 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列: 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行: 3.若(K−1)在第一行最后一列,则将K填

P1978 神奇的幻方

P1978神奇的幻方 描述 幻方是一种很神奇的 N ∗ N 矩阵:它由数字 1,2,3, … … , N ∗ N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N 为奇数时,我们可以通过以下方法构建一个幻方: 首先将 1 写在第一行的中间. 之后,按如下方式从小到大依次填写每个数 K(K = 2,3, … , N ∗ N) : 若 (K − 1) 在第一行但不在最后一列,则将 K 填在最后一行, (K − 1) 所在列的右一列: 若 (K − 1) 在最后一列但不在第一行,则将 K 填

noip2015day1 T1 4510 神奇的幻方

4510 神奇的幻方 noip2015day1 T1 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将 1写在第一行的中间.之后,按如下方式从小到大依次填写每个数(K= 2,3, … ,N∗N ): 1.若 (K−1)在第一行但不在最

东方14模拟赛之noip2015/day1/3/神奇的幻方

总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  128000kB 描述 幻方是一种很神奇的N*N 矩阵:它由数字 1,2,3, … …,N*N 构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将 1 写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K= 2,3, …,N*N ): 若 (K−1) 在第一行但不在最后一列,则将K填在最后一行,(K−1) 所在列的右一列: 若 (K−1) 在最

AC日记——神奇的幻方 洛谷 P2615(大模拟)

题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N): 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列: 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行: 3.若(K−1)在第一行最后一列,则将K填在(K−1)

NOIP 2015普及组复赛Day1 T1 == Codevs4510 神奇的幻方

时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description: 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将 1写在第一行的中间.之后,按如下方式从小到大依次填写每个数(K= 2,3, … ,N∗N ): 1.若 (K−1)在第一行但不在最后一列,则将 填在最后一行,(K−1)所在列的右一列: 2.若 (K

神奇的幻方【够造奇数阶的魔方阵】

http://noi.openjudge.cn/ch0108/22/ 总时间限制:  1000ms 内存限制:  65535kB 描述 幻方是一个很神奇的N*N矩阵,它的每行.每列与对角线,加起来的数字和都是相同的.我们可以通过以下方法构建一个幻方.(阶数为奇数)1.第一个数字写在第一行的中间2.下一个数字,都写在上一个数字的右上方:    a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列    b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行    

[NOIP2015] 提高组 洛谷P2615 神奇的幻方

题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N): 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列: 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行: 3.若(K−1)在第一行最后一列,则将K填在(K−1)

洛谷-神奇的幻方-NOIP2015提高组复赛

题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N): 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列: 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行: 3.若(K−1)在第一行最后一列,则将K填在(K−1)

刷过一题之NOIP201505神奇的幻方

幻方是一种很神奇的 N*N 矩阵:它由数字 1,2,3,... ,N*N 构成,且每行.每列及两条对角线上的数字之和都相同.当 N 为奇数时,我们可以通过下方法构建一个幻方:首先将 1 写在第一行的中间.之后,按如下方式从小到大依次填写每个数 K (K=2,3,...,N*N) :1.若 (K-1) 在第一行但不在最后一列,则将 K 填在最后一行, (K-1) 所在列的右一列:2.若 (K-1) 在最后一列但不在第一行,则将 K 填在第一列, (K-1) 所在行的上一行:3.若 (K-1) 在第