二维数组的三角填充 两种java实现的方法

类似这种:

  • 1 2 3 4 5
  • 12 13 14 6
  • 11 15 7
  • 10 8
  • 9
    认为第二种方法简单还是第一种方法简单直接决定了你的水平.
package test;
/**
 * 二维数组 三角填充
 * 1  2  3  4  5
 * 12 13 14 6 
 * 11 15 7
 * 10 8
 * 9
 * 
 * 1  2  3  4  5  6
 * 15 16 17 18 7
 * 14 21 19 8
 * 13 20 9
 * 12 10
 * 11
 * 
 * 1    2   3   4   5  6  7
 * 18 19 20 21 22 8
 * 17 27 28 23 9
 * 16 26 24 10
 * 15 25 11
 * 14 12
 * 13
 * @author fans
 */

public class ArrayTest {
	public static void main(String[] args) throws InterruptedException {
		ArrayTest a = new ArrayTest();
		int count = 12;//第一排数字的个数
		
		//从小到大排序
		long begin  = System.currentTimeMillis();
		int[][] bc = a.TriangleFill(count);
		long end = System.currentTimeMillis();
		System.out.println(end - begin);
		
		//从大到小排序
		//begin  = System.currentTimeMillis();
		//int[][] bc1 = a.rTriangleFill(count);
		//end = System.currentTimeMillis();
		//System.out.println(end - begin);
		
		//输出结果
		for(int i = 0; i < count; i++) 
		{
			int size = bc[i].length;
			for(int j = 0; j < size; j++) 
			{
				int number = bc[i][j];
				if(number > 0) 
				{
					System.out.print(number + "\t");
				}
			}
			System.out.println("\n");
		}
	}
	
	//第一种:从最小一个数依次添加(正推)
	public int[][] TriangleFill(int count)
	{
		//创建对应数量及大小的数组
		int[][] arr = new int[count][];
		int size = count;
		for(int i = 0; i < count; ++i)
		{
			arr[i] = new int[size];
			size--;
		}
		
		int n = count; //方向的次数
		int direction = 0;//  方向 0 右 1 下  2上
		int x = 0, y = -1;每个点的坐标
		int num = 1;//数值
		while(n > 0)
		{
			for(int i = 0; i < n; ++i)
			{
				switch(direction) {
				case 0:
					arr[x][++y] = num++;
					if(i + 1 >= n)direction = 1;//改变方向
					break;
				case 1:
					arr[++x][--y] = num++;
					if(i + 1 >= n)direction = 2;//改变方向
					break;
				case 2:
					arr[--x][y] = num++;
					if(i + 1 >= n)direction = 0;//改变方向
					break;
				}
			}
			n--;
		}
		return arr;
	}
	
	//第二种:从最大一个点依次往外添加(逆推, 个人倾向于这种方法,逆天而行才是王道!-.-)
	public int[][] rTriangleFill(int count)
	{
		//创建对应数量及大小的数组
		int[][] arr = new int[count][];
		int size = count;
		for(int i = 0; i < count; ++i)
		{
			arr[i] = new int[size];
			size--;
		}
		int max = (count + 1) * count / 2; //最大值 等差数列公式:(1+n)n/2
		int direction = count % 3 ; // 最大值的方向0 下   1 左  2上
		int x = count >=2 ? (count - 1) / 3 : 0;//最大值的x
		int y = count >=2 ?(count + 1) / 3 : 0; //最大值的y
		int beginPoint = 1;
		while(max > 0)
		{
			for(int i = 0; i < beginPoint; ++i)
			{
				switch(direction) {
					case 0:
						if(i + 1 >= beginPoint)direction = 2;
						arr[y++][x] = max--;
						break;
					case 1:
						if(i + 1 >= beginPoint)direction = 0;
						arr[y][x--] = max--;
						break;
					case 2:		
						if(i + 1 >= beginPoint)direction = 1;
						arr[y--][x++] = max--;
						break;
				}
			}
			beginPoint++;
		}
		return arr;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值