• [NOIP2015 提高组] 神奇的幻方


    [NOIP2015 提高组] 神奇的幻方

    题意

    幻方是一种很神奇的 (N imes N)矩阵:它由数字 1,2,3,(cdots cdots) ,N ( imes) N 构成,且每行、每列及两条对角线上的数字之和都相同。

    N 为奇数时,我们可以通过下方法构建一个幻方:

    首先将 1写在第一行的中间。

    之后,按如下方式从小到大依次填写每个数 K ((K=2,3,cdots,N imes N))

    1. 若 (K−1) 在第一行但不在最后一列,则将 K 填在最后一行, (K−1) 所在列的右一列;
    2. 若 (K−1) 在最后一列但不在第一行,则将 K 填在第一列, (K−1) 所在行的上一行;
    3. 若 (K−1) 在第一行最后一列,则将 K 填在 (K−1) 的正下方;
    4. 若 (K−1) 既不在第一行,也不在最后一列,如果 (K−1) 的右上方还未填数,则将 K 填在 (K−1) 的右上方,否则将 K 填在 (K−1) 的正下方。

    现给定 N ,请按上述方法构造 N×N* 的幻方。

    分析

    模拟即可,这题的意义在于给出了一种构造方法

    代码

    int mp[40][40];
    
    int main(){
    	int n = rd();
    	mp[1][n / 2 + 1] = 1;
    	pii lst = make_pair(1,n / 2 + 1);
    	for(int i = 2;i <= n * n;i++){
    		if(lst.fi == 1 && lst.se != n) {
    			mp[n][lst.se + 1] = i;
    			lst = make_pair(n,lst.se + 1);
    		}
    		else if(lst.se == n && lst.fi != 1 ) {
    			mp[lst.fi - 1][1] = i;
    		   	lst = make_pair(lst.fi - 1,1);	
    		}
    		else if(lst.fi == 1 && lst.se == n) {
    			mp[lst.fi + 1][lst.se] = i;
    			lst = make_pair(lst.fi + 1,lst.se);
    		}
    		else {
    			if(!mp[lst.fi - 1][lst.se + 1]) {
    				mp[lst.fi - 1][lst.se + 1] = i;
    				lst = make_pair(lst.fi - 1,lst.se + 1);
    			}
    			else{
    				mp[lst.fi + 1][lst.se] = i;
    				lst = make_pair(lst.fi + 1,lst.se);
    			}
    		}
    	}
    	for(int i = 1;i <= n;i++){
    		for(int j = 1;j < n;j++){
    			printf("%d ",mp[i][j]);
    		}
    		printf("%d
    ",mp[i][n]);
    	}
    }
    
  • 相关阅读:
    《精通情绪》读书笔记
    绩效评估与绩效反馈
    数据分析报告格式zz
    学会谈判zz
    javascript中的双向绑定
    理解 DocumentFragment
    理解Object.defineProperty()
    Vue 改变数组中对象的属性不重新渲染View的解决方案
    ES6中Object.assign() 方法
    控制input输入框光标的位置
  • 原文地址:https://www.cnblogs.com/hznumqf/p/15189775.html
Copyright © 2020-2023  润新知