图形矩阵(回型&蛇型)

回型矩阵

回形矩阵有n行n列;数字按顺时针或者逆时针递增。

第一圈:

上边界:y不变,x++;右边界:x不变,y++;下边界:y不变,x--;左边界:x不变,y--

第二圈:

上边界:y+1不变,(x+1)++;右边界:x+1不变,(y+1)++;下边界:y+1不变,(x+1)--;
左边界:x+1不变,(y+1)--

 static void printN(int n) {
     int[][] arr = new int[n][n];
     int count = 1;
     //i代表圈数;n*n回型阶矩阵有n/2圈;j表示行,k表示列
     for (int i = 0; i < n / 2; i++) {
         //(上)
         for (int j = i,k =i; k <n-i-1 ; k++) {
             arr[j][k] = count++;
         }
         //(右)
         for (int j = i,k =n-i-1 ; j <n-i-1 ; j++) {
             arr[j][k] = count++;
         }
         //(下)
         for (int j =n-i-1 ,k=n-i-1; k> i ; k--) {
             arr[j][k] = count++;
         }
         //(左)
         for (int j = n-i-1,k=i; j >i ; j--) {
             arr[j][k] = count++;
         }
     }
     //如果是奇数,则中间的位置会是空缺的,需要填充
     if(n%2 == 1){
         arr[n/2][n/2]=count;
     }
     //遍历
     for (int i = 0; i < n; i++) {
         for (int j = 0; j < n; j++) {
             System.out.print (arr[i][j] + " ");
         }
         System.out.println ();
     }
 }

蛇型矩阵

类似于上面的回型矩阵的输出的方法,每一次在数组中填写新的数字都有一个方向,与输出回型矩阵不同的是不是简单的上下左右四个方向,这里涉及到是右,下,右上,左下四个方向。

向右上位置填写元素的时候可能会碰到边界,即行<0或者是列>=N,如果行<0,那么接下来就需要向右填写元素,列大于等于N,那么接下来就要向下填写元素。

向下添加元素时,也会碰到一些情况,例如行>=N了,表示添加到最后一行了,此时需要向右上移动,另外在第一列和最后一列向下添加元素情况也不一样,在第一列向下添加元素后,接下来应该向右上添加元素,在最后一列向下添加元素后接下来应该向左下添加元素

我们向右上走就x++;y--;向坐下走就x--;y++。(x,y分别表示坐标,但是放在数组里要反一下)

import java.util.Scanner;
public class Main{
	public static void main(String[] args){
		int [][] arr=new int[100][100];
		Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                 arr[i][j]=0;
            }
        }
        int i=0,j=0;//行,列
        int direct;
        int RorD=0;//右行或下行
        int LD=1;//左下
        int DorR=2;//下行
        int RU=3;//右上
        //因为这里先从右边开始走,所有先把代表右行的值赋给direct
        direct=RorD;
        for(int v=1;v<=n*n;v++){
            arr[i][j]=v;//赋值
            switch(direct){
                case 0:// 向右或向下1步
                    if(j<n-1){//右行
                        j++;
                    }else{//在第n-1列时(到达边界),下行
                        i++;
                    }
                    direct=LD;//右行玩该左下了
                    break;
                case 1:
                    i++;
                    j--;
				    if(j==0 || i==n-1)//到第0列时该下行,到达第n-1行时该右行;没到边界就继续左下
					    direct=DorR;
				    break;
                case 2:	// 向下或向右1步
				    if(i<n-1)  
					    i++;			// 在第0列中,向下
				    else
					    j++;			// 在第n-1行中,向右
				    direct=RU;
				    break;
                case 3:
                    i--;
                    j++;
				    if(j==n-1 || i==0) //到n-1列时下行,到第0行时右行
					    direct=RorD;
				    break;
            } 
        }
        //输出
        for(i=0; i<n; i++){
            for(j=0; j<n; j++){
                 System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
       
	}
}

蛇形填数

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如下图所示,小明用从 11 开始的正整数“蛇形”填充无限大的矩阵。

1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...

容易看出矩阵第二行第二列中的数是 55。请你计算矩阵中第 2020 行第 2020 列的数是多少?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

​ 

不难发现规律: 每一条对角线上的数字量都与行数/列数相等,即第n条对角线上有n个数

每第n行第n列交叉点上的数都处于对角线上终点位置。

因为第2行2列的数在第3条对角线上,第4行4列的数在第7条对角线上....所以满足第n行第n列交叉点上的数位于第(2*n-1)条对角线上

所以,直接由数学公式可推算得结果:

2*20-1=39;

1+2+3+...+38+(39/2+1)=(1+38)*38/2+19+1=761.

蛇形上三角

蛇形矩阵是由1开始的自然数依次排列的一个矩形上三角。

样例输入

本题有多组数据,每组由一个正整数N组成。(N不大于100)(分组测试)

5
1

样例输出

对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要有额外的空行,矩阵三角中同一行的数字用一个空格分开,行尾不要多余的空格。

1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
1

可以发现这里仅进行一次下行,主要还是右上,左下。或者更为确切的说只有左上,每当左上达到第0行时,即该对角线的元素数量遍历完后,进入下一层的第0列重复该操作。

并且根据题意两组输出之间不要有额外的空行且行尾不要多余的空格,故在输出时,应该在每一层的最后一个数组元素后输出一个换行符,形如: 

if(j==num-i-1) {
    System.out.printf("\n");
}
import java.util.Scanner;
public class Main{
	public static void main(String[] args){
		int [][] arr=new int[100][100];
		Scanner scanner=new Scanner(System.in);
		while(scanner.hasNext()) {
			int k=1;
		int num=scanner.nextInt();
		for(int i=0;i<num;i++) {//层数
			for(int j=0,p=i,q=0;j<=i;j++) {
				arr[p][q]=k++;
				if(p==0) {
					break;
				}
				else {
					p--;
					q++;
				}
			}
		}
		for(int i=0;i<num;i++) {
			for(int j=0;j<num-i;j++) {
				System.out.printf("%d ",arr[i][j]);
				if(j==num-i-1) {
					System.out.printf("\n");
				}
			}
		}
		}
	}
}

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值