首页 > 其他分享 >【NOIP2015】【Luogu2615】神奇的幻方(模拟填数)

【NOIP2015】【Luogu2615】神奇的幻方(模拟填数)

时间:2023-03-25 12:34:01浏览次数:31  
标签:NOIP2015 第一行 int include 填数 maxn 一列 Luogu2615


problem

  • 给一定n*n的矩阵,要求填上1~n*n的数,使之每行、列、对角线的和都相等。
  • 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<39,输出幻方。

solution

直接模拟,填数

codes

#include<iostream>
#include<cstring>
using namespace std;

const int maxn = 50;
int a[maxn][maxn];

int main(){
    memset(a,0,sizeof(a));//数组清零
    int n;  cin>>n;
    int x = 1, y = (n+1)/2, tot = n*n;//中间位置
    a[x][y] = 1;
    for(int k = 2; k <= tot; k++){
        if(x==1 && y!=n){
            a[n][y+1] = k;//注意k++
            x = n, y = y+1;
            continue;//x,y值改变了要continue
        }
        if(x!=1 && y==n){//条件看错
            a[x-1][1] = k;
            x = x-1, y = 1;
            continue;
        }
        if(x==1 && y==n){
            a[x+1][y] = k;
            x = x+1, y = y;
            continue;
        }
        if(x!=1 && y!=n){
            if(a[x-1][y+1]==0){
                a[x-1][y+1] = k;
                x = x-1, y = y+1;
            }else{
                a[x+1][y] = k;
                x = x+1, y = y;
            }
            continue;
        }
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            cout<<a[i][j]<<" ";
        }
        cout<<'\n';
    }
    return 0;
}


#include<iostream>
#include<cstring>
using namespace std;

const int maxn = 50;
int a[maxn][maxn];

int main(){
    memset(a,0,sizeof(a));//数组清零
    int n;  cin>>n;
    int x = 1, y = (n+1)/2, tot = n*n;//中间位置
    a[x][y] = 1;
    for(int k = 2; k <= tot; k++){
        if(x==1 && y!=n){
            a[n][y+1] = k;//注意k++
            x = n, y = y+1;
            continue;//x,y值改变了要continue
        }
        if(x!=1 && y==n){//条件看错
            a[x-1][1] = k;
            x = x-1, y = 1;
            continue;
        }
        if(x==1 && y==n){
            a[x+1][y] = k;
            x = x+1, y = y;
            continue;
        }
        if(x!=1 && y!=n){
            if(a[x-1][y+1]==0){
                a[x-1][y+1] = k;
                x = x-1, y = y+1;
            }else{
                a[x+1][y] = k;
                x = x+1, y = y;
            }
            continue;
        }
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            cout<<a[i][j]<<" ";
        }
        cout<<'\n';
    }
    return 0;
}


标签:NOIP2015,第一行,int,include,填数,maxn,一列,Luogu2615
From: https://blog.51cto.com/gwj1314/6149274

相关文章

  • P2679 [NOIP2015 提高组] 子串
    两个仅包含小写英文字母的字符串AA和BB。现在要从字符串AA中取出kk个互不重叠的非空子串,然后把这kk个子串按照其在字符串AA中出现的顺序依次连接起来得到一个......
  • 蛇形填数
    蛇形填数题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。126715.......
  • NOIP2015 普及组 推销员题解
    原题链接给定一个数轴,数轴上有一些点,第\(i\)个点离起点的距离是\(S_i\),取走它要消耗\(A_i\)的代价,同时在数轴上每移动一格要\(1\)的代价,路线只能从数轴......
  • 【NOIP2015】【Vijos1979】信息传递(有向图最小环大小)
    problem给定一张n个点,n条边的有向图求图的最小环,输出大小solutionkosaraju暴力求出所有强连通分量,取最小值即可codes//kosaraju#include<iostream>#include<al......
  • 【NOIP2015】【Luogu2678】跳石头
    problemsolutioncodes//二分答案//QAQ注意:起点和终点也是有石头的w#include<iostream>#include<algorithm>#definemaxn100010usingnamespacestd;intll,n,......
  • 【题解】[FJOI2017]矩阵填数
    题目分析:最大值为\(v\)的限制显然可以转化为\(\lev\)的方案数减去\(\lev-1\)的方案数。因为这里有很多个这种限制所以直接容斥就好了,具体来说就是枚举哪些条件取......
  • [NOIP2015 提高组] 子串 【计数dp】
    题面https://www.luogu.com.cn/problem/P2679分析CCF数据真的水。不过还是要写下正解:令\(dp[i][j][t][0/1]\)表示\(a\)串前\(i\)个字符,\(b\)串前\(j\)个字符,匹配子串数......
  • NC16466 [NOIP2015]信息传递
    题目链接题目题目描述有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti的同......
  • 蛇形填数——蓝桥杯(简单)
    题目描述如下图所示,小明用从 11 开始的正整数“蛇形”填充无限大的矩阵。  容易看出矩阵第二行第二列中的数是 55。请你计算矩阵中第 2020 行第 2020 列的数......
  • 洛谷 P2679 [NOIP2015 提高组]子串
    \(70pts\):记\(sub_A(i)\)表示\(A\)的前\(i\)个字符构成的子串,相应地,\(sub_B(i)\)为\(B\)的前\(i\)个字符构成的子串。设\(f(i,j,k)\)表示在\(sub_A(i......