java 二维数组奇数金字塔_二维数组:奇数阶魔方 | 新思维:C语言程序设计
幻方,有時又稱魔方,由一組排放在正方形中的整數組成,其每行、每列以及兩條對角線上的數之和均相等。通常幻方由從到的連續整數組成。
Siamese方法(Kraitchik 1942年,pp. 148-149)是構造奇數階幻方的一種方法,說明如下:
1)把1放置在第一行的中間
2)從2開始直到n×n的各數依次放在右上方格中
3)當右上方格出界的時候,則由另一邊則回繞。例如1在第1行,則2應放在最下一行,列數同樣加1
4)如果按上面規則確定的位置上已有數,或上一個數位于最右上方時,則把下一個數放在上一個數的下面 按照以上步驟直到填寫完所有方格。
輸入: 自然數n(1<=n<=20,n是奇數)
輸出: n行,每行n個數,每個數占4個字符位置。 提示:使用 printf("%4d", x) 來打印
思路分析
下面的程序使用 i 表示行,用 j 表示列, k 表示要放置的數,k 的范圍是 [1..n*n]
放置的過程可以簡要描述為:
1) 確定第0個數的位置
2) 放置 1~ n*n 個數:確定初步位置,也就是 i 和 j 的值; 如果出界,就進行調整;放置 k
3) 確定初步位置有兩種選擇:放置在前一個數的下方或者右上方
奇數魔方的自然語言描述如下:
確定1的位置坐標 i 和 j;
在 i 和 j 這個位置放置 1;
for (放置2~n*n個數) {
if (k in [1,n+1,2*n+1, ..., (n-1)*n+1])
下方;
else {
右上方;
}
if (在第0行) 調整到第n行;
if (在第n+1列) 調整到第1列;
放置 k 到 a[i][j];
}
輸出二維矩陣;
確定1的位置坐標 i 和 j;
在 i 和 j 這個位置放置 1;
for (放置2~n*n個數) {
if (k in [1,n+1,2*n+1, ..., (n-1)*n+1])
下方;
else {
右上方;
}
if (在第0行) 調整到第n行;
if (在第n+1列) 調整到第1列;
放置 k 到 a[i][j];
}
輸出二維矩陣;
奇數魔方的C語言參考代碼如下:
#include
#define N 21
int main(int argc, char *argv[])
{
int n, k, i, j;
int a[N][N];
scanf("%d", &n);
i= 1; j=(n+1)/2;
a[i][j]=1;
for (k=2; k<=n*n; k++) {
if (k%n==1)
i = i+1;
else {
i = i-1; j = j+1;
}
if (i==0) i = n;
if (j==n+1) j = 1;
a[i][j] = k;
}
for (i=1; i<=n; i++) {
for (j=1; j<=n; j++)
printf("%4d", a[i][j]);
printf("\n");
}
return 0;
}
#include
#define N 21
int main(int argc, char *argv[])
{
int n, k, i, j;
int a[N][N];
scanf("%d", &n);
i= 1; j=(n+1)/2;
a[i][j]=1;
for (k=2; k<=n*n; k++) {
if (k%n==1)
i = i+1;
else {
i = i-1; j = j+1;
}
if (i==0) i = n;
if (j==n+1) j = 1;
a[i][j] = k;
}
for (i=1; i<=n; i++) {
for (j=1; j<=n; j++)
printf("%4d", a[i][j]);
printf("\n");
}
return 0;
}
奇數魔方的JAVA參考代碼如下:
import java.util.Scanner;
public class P1304 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n, k, i, j;
n = cin.nextInt();
int [][] a = new int[n+1][n+1];
i= 0; j=(n+1)/2;
for (k=1; k<=n*n; k++) {
if (k%n==1 || n==1)
i = i+1;
else {
i = i -1; j = j+1;
}
if (i==0) i = n;
if (j==n+1) j = 1;
a[i][j] = k;
}
for (i=1; i<=n; i++) {
for (j=1; j<=n; j++)
System.out.printf("%4d", a[i][j]);
System.out.printf("\n");
}
}
}
import java.util.Scanner;
public class P1304 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n, k, i, j;
n = cin.nextInt();
int [][] a = new int[n+1][n+1];
i= 0; j=(n+1)/2;
for (k=1; k<=n*n; k++) {
if (k%n==1 || n==1)
i = i+1;
else {
i = i -1; j = j+1;
}
if (i==0) i = n;
if (j==n+1) j = 1;
a[i][j] = k;
}
for (i=1; i<=n; i++) {
for (j=1; j<=n; j++)
System.out.printf("%4d", a[i][j]);
System.out.printf("\n");
}
}
}
總結
以上是生活随笔為你收集整理的java 二维数组奇数金字塔_二维数组:奇数阶魔方 | 新思维:C语言程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 燕窝多少钱一盒啊?
- 下一篇: 创造与魔法浮空岛怎么上去