689D Magic Odd Square 奇数幻方
生活随笔
收集整理的這篇文章主要介紹了
689D Magic Odd Square 奇数幻方
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1 奇數(shù)階幻方構(gòu)造法
?(1) 將1放在第一行中間一列;
?(2) 從2開始直到n×n止各數(shù)依次按下列規(guī)則存放:按 45°方向行走,向右上,即每一個數(shù)存放的行比前一個數(shù)的行數(shù)減1,列數(shù)加1
?(3) 如果行列范圍超出矩陣范圍,則回繞。例如1在第1行,則2應(yīng)放在最下一行,列數(shù)同樣加1;
?(4) 如果按上面規(guī)則確定的位置上已有數(shù),或上一個數(shù)是第1行第n列時,則把下一個數(shù)放在上一個數(shù)的下面。
#include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<stdio.h> #include<stdlib.h> #include<queue> #include<math.h> #include<map> #define INF 0xffffffff #define MAX 1005 #define Temp 1000000000 #define MOD 1000000007using namespace std;int Map[MAX][MAX];void MagicSquare(int n) {Map[1][(n+1)/2]=1;//首先填第一行中間列 1int x=1,y=(n+1)/2;for(int i=2;i<=n*n;i++){if(x==1 && y==n)//若當(dāng)前位置為(1,n)則下一個數(shù)填到當(dāng)前數(shù)字下方 {x=x+1;y=y;Map[x][y]=i;continue;}if(y==n)//若超出邊界則回繞 {if(Map[x-1][1]==-1){x=x-1;y=1;Map[x][y]=i;}else{x=x+1;Map[x][y]=i;}continue;}if(x==1)//若超出邊界則回繞 {if(Map[n][y+1]==-1){x=n;y=y+1;Map[x][y]=i;}else{x=x+1;Map[x][y]=i;}continue;}else//向右上方填 {if(Map[x-1][y+1]!=-1)//若右上方已有數(shù)字,當(dāng)前數(shù)字填當(dāng)前位置下方 {x=x+1;y=y;Map[x][y]=i;}else{x=x-1;y=y+1;Map[x][y]=i;}continue;}} }int main() {int n;while(scanf("%d",&n)!=EOF){memset(Map,-1,sizeof(Map));MagicSquare(n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%d%c",Map[i][j],j==n?'\n':' ');}}}return 0; } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/alan-W/p/6008863.html
總結(jié)
以上是生活随笔為你收集整理的689D Magic Odd Square 奇数幻方的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浦发现金分期利率多少钱?分期期数决定费率
- 下一篇: 工行长隆联名信用卡怎么样?门票5折还不快