“魔方阵“c语言实现,奇数型
【問題描述】
"魔方陣"是指一個AN*N矩陣(在本題中N僅為奇數(shù),且N>1),以自然數(shù)1,2, 。。。 N2為元素進(jìn)行填充,每個位置上分別放置一個元素,使每行、每列以及主、副對角線上的元素之和都相等。
如3*3魔方陣,圖在每行、每列、主對角線、副對角線上元素之和均為15:
8? 1? 6
3? 5? 7
4? 9? 2
奇數(shù)階魔方陣的生成算法如下,初始矩陣A為空,從1開始依據(jù)下面的規(guī)則依次放置各個自然數(shù)(注意在下面的敘述中各元素行、列下標(biāo)均以1-N計數(shù)):
1.???????? 將1放在第一行正中的位置,即A[1, (j+1)/2];
2.???????? 設(shè)最后放置的元素是A[i, j],則將下一個元素放在最后一個插入位置的右上方,即A[i-1, j+1]。但如果該位置已超出方陣的上邊界(即如果i<0),則新位置取該列的最下一個位置,即A[N, j+1];如果該位置已超出方陣的右邊界,取新位置取該行的最左一個位置,即A[i-1, 1]。
3.???????? 若最近一個插入元素為N的整倍數(shù),則新位置取最后插入元素下面的位置,即A[i+1, j]。
輸入一個奇數(shù)N,打印對應(yīng)的N階魔方陣。
【輸入形式】
控制臺輸入一奇數(shù)N。
【輸出形式】
輸出一個N*N的魔方陣,其中每個數(shù)字占4位字符的寬度,向右對齊。
【樣例輸入】
【樣例輸出】
??17??24???1???8??1523???5???7??14??164???6??13??20??2210??12??19??21???311??18??25???2???9【樣例說明】
輸入奇數(shù)5,輸出5階魔方陣。
看題目與樣例輸出,可以得出規(guī)律,從1開始到n*n,每個數(shù)都在上個數(shù)的右上角,墻有穿透性,如果右上角已經(jīng)被賦值則下個數(shù)向下走一格;
如此可以得出
#include <stdio.h> #include <stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */ void mofang(int n){int a[100][100]={0},i,q=0,p=0,j,_q,_p;p=(n+1)/2-1;//將1放在第一行正中的位置,即a[0, (j+1)/2-1];a[q][p]=1;for(i=2;i<=n*n;i++){_q=q;//保存一開始的值_p=p; //在對角情況if(q==0&&p==n-1){q=n-1;p=0;} //在第一行邊界情況else if(q==0){q=n-1;p=p+1;} //在最后一列邊界else if(p==n-1){q=q-1;p=0;} //普通情況else{q--;p++;} //如果他的右上方被占領(lǐng)if(a[q][p]!=0&&q==n-2){q=0;p=_p;}else if(a[q][p]!=0){q=_q+1;p=_p;}a[q][p]=i;} //輸出for(i=0;i<n;i++){for(j=0;j<n;j++){printf("%4d",a[i][j]);}printf("\n");} } int main(int argc, char *argv[]) {int n;scanf("%d",&n);mofang(n);return 0; }總結(jié)
以上是生活随笔為你收集整理的“魔方阵“c语言实现,奇数型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HBuilder X 常用的快捷键
- 下一篇: VMware虚拟机硬盘容量扩容(超简单)