- 矩阵主要有:
- 蛇形矩阵
- 螺旋矩阵
- 幸运矩阵
- 拉丁矩阵
- 魔方矩阵
- 螺丝矩阵
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
对于n阶魔方矩阵,想顺时针输入一个螺旋。螺丝矩阵分为奇数阶和偶数阶,但是我们利用取余的方式把奇数阶和偶数阶合成一个公式。最后再加个判断,如果是奇数阶,矩阵的[n/2,n/2]处加上一个n平方就可以了。
package suanfa;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
//int n=5;
int shu[][]=new int[n][n];
int c=1;
for(int loop=0;loop<(n)/2;loop++){//控制循环圈数
//上圈
for (int j = loop; j <n-(loop+1); j++) {
shu[loop][j]=c++;
}
//右圈
for (int j = loop; j <n-(loop+1); j++) {
shu[j][n-(loop+1)]=c++;
}
//下圈
for (int j =n-(loop+1); j>loop; j--) {
shu[n-(loop+1)][j]=c++;
}
//左圈
for (int j =n-(loop+1); j >loop; j--) {
shu[j][loop]=c++;
}
}
if(n%2!=0){
shu[n/2][n/2]=c++;
}
for (int i = 0; i <n; i++) {
for (int j = 0; j <n; j++) {
System.out.print(shu[i][j]+"\t");
}
System.out.println();
}
}
}
- 蛇形矩阵:
按照对角线可以把它分成前半部分和后半部分,然后按照规律让两边按照蛇形自增和自减。
package suanfa;
import java.util.Scanner;
public class Snake {
public static void main(String[] args) {
/*1 3 6
2 5 7
4 8 9*/
/* x:
y: 00 01 02
10 11 12
20 21 22*/
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[][] shu=new int[n][n];
int loop=1;
// shu[0][0]=1;
// shu[1][0]=2;
// shu[0][1]=3;
//前半部分
for (int i = 0; i <n; i++) {
for (int j = 0 , n1=i; j <=i&&n1>=0; j++ ,n1--) {
shu[n1][j]=loop++;
}
}
//后半部分
for (int i =0; i<shu.length-1; i++) { //外层都表示循环遍数
for (int j = i+1,n2=shu.length-1; j < shu.length&&n2>=i; j++,n2--) {
shu[j][n2]=loop++;
}
}
for (int i = 0; i < shu.length; i++) {
for (int j = 0; j < shu.length; j++) {
System.out.print(shu[i][j]+"\t");
}
System.out.println("\t");
System.out.println();
}
}
}
- 魔方矩阵:
package suanfa;
import java.util.Scanner;
public class RubikCube {
public static void main(String[] args) {
/* 8 1 6
* 3 5 7
* 4 9 2*/
Scanner sc=new Scanner(System.in);
int ss=sc.nextInt();
int[][] a=new int[ss][ss];
int x=0;
int y=a.length/2; //奇宫格,a.length是偶数。
a[x][y]=1;//定义1的位置
for (int i = 2; i <=a.length*a.length; i++) {
//拿着1的坐标去找2的坐标,上右
//上
x=x-1;
if(x<0) x=a.length-1;//if只有一条语句可以省略括号
//右
y=y+1;
if(y>a.length-1) y=0;
if(a[x][y]!=0){//如果位置被占
//下下左
x=x+1;
if(x>a.length-1) x=0;
x=x+1;
if(x>a.length-1) x=0;
y=y-1;
if(y<0) y=a.length-1;
a[x][y]=i;
}else{
a[x][y]=i;
}
}
//打印
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
}
}