java算法001:魔方矩阵,蛇形矩阵,螺旋矩阵

  • 矩阵主要有:
  • 蛇形矩阵
  • 螺旋矩阵
  • 幸运矩阵
  • 拉丁矩阵
  • 魔方矩阵
  • 螺丝矩阵
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();
		  }
		 }
	}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值