问题:
从键盘读入一个数,打印出以下特点的矩阵。
如输入3,则输出为:
1 2 3
8 9 4
7 6 5
若输入4,则输出为:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
显然,该问题应用数组来存储数据,所以重点是找出赋值的规律。从问题中能够看出,矩阵是按顺时针顺序,从外圈到内圈,由1到n逐个赋值,且每行(列)都为n个数。
想法
以一个6*6的回行矩阵为例,将每个数视为一个点,按照顺序依次连接,得到一个"回行迷宫"。按照其规律,我们就是要沿着迷宫墙壁(即图示连线)走,每走一步,赋一个值,走到一定步数后就90°转向换个方向继续走。
Question:
那么,要走多少步呢?这个步长是否也有规律可循?还有,转向时的方向该如何判断?...
仔细揣摩,发现矩阵走完每一面墙壁的步长依次是5、5、5、4、4、3、3、2、2、1、1,走完一个步长即转向,且只有上、下、左、右四个方向。
若抛开第一面墙壁,则剩余的墙壁中,每两个墙壁具有相同的长度,且互相垂直,同时每走完两面墙壁,步长减1。故考虑第一面墙壁单独处理,剩余墙壁按相同规则处理。
试着连接副对角线上的数,则可得到5个从大到小、以虚线为底边的等腰直角三角形(暂且不管第一行),且5个等腰直角三角形的腰长依次为5、4、3、2、1 (接下来我们就以一个三角形为基准来执行操作)。
先将第一行单独赋值,然后就是走出5个等腰直角三角形。
站在小人位置,第一个三角形腰长为5(初始方向向下),接着每走完一个腰长就90°转向,每走完两个腰长(即走出一个等腰直角三角形),将腰长-1。
转向周期为4,按照向下、向左、向上、向右的顺序,以此往复。
总结
- 对于一个n*n的回行矩阵,将其每个数视为一个点,按赋值顺序依次连接起来;
- 连接副对角线上的点,则可得到
n-1
个等腰直角三角形以及额外的一条直线 (即第一行); 这n-1
个等腰直角三角形的腰长逐个递减1; - 第一行单独赋值。走三角形时的初始方向为向下,步长为
n-1
,走完一个步长转向,走完两个步长除了转向还要将步长减1; - 循环条件为
while(a[i][j] != n*n)
,方向用四个数字表示,可通过方向变量的值来控制方向变化。
代码实现
public class NumberOfRounds { private static final int DOWN = 0; //向下 private static final int LEFT = 1; //向左 private static final int UP = 2; //向上 private static final int RIGHT = 3; //向右 public static void main(String [] args) { Scanner sc = new Scanner(System.in); System.out.println("Please input num:"); int n; n = sc.nextInt(); int[][] roundsNum = new int[n][n]; int number=1; int i=0,j=0; //先单独处理第一行 while(i==0&&j<n) { roundsNum[i][j] = number++; j++; } j--; int direction = 0; int step = n-1; int currentStep=0; while(roundsNum[i][j]!=n*n) { switch(direction%4){ case DOWN: i++; break; case LEFT: j--; break; case UP: i--; break; case RIGHT: j++; break; } roundsNum[i][j] = number++; currentStep++; if(currentStep % step == 0) { direction++; //走完一个等腰三角形,则将当前已走步数清0,并将步长减1 if(currentStep == step*2) { step--; currentStep=0; } } } }}
原文转载:http://www.shaoqun.com/a/523520.html
lastpass:https://www.ikjzd.com/w/846
ifttt:https://www.ikjzd.com/w/956
问题:从键盘读入一个数,打印出以下特点的矩阵。如输入3,则输出为:123894765若输入4,则输出为:12341213145111615610987显然,该问题应用数组来存储数据,所以重点是找出赋值的规律。从问题中能够看出,矩阵是按顺时针顺序,从外圈到内圈,由1到n逐个赋值,且每行(列)都为n个数。想法以一个6*6的回行矩阵为例,将每个数视为一个点,按照顺序依次连接,得到一个"回行迷宫"。按照其
笨鸟海淘:笨鸟海淘
淘粉8:淘粉8
比起双十一花光所有积蓄,更令人崩溃的是我买的二审账号挂了!:比起双十一花光所有积蓄,更令人崩溃的是我买的二审账号挂了!
Shopee推出专业KOL代理服务抢夺东南亚市场!:Shopee推出专业KOL代理服务抢夺东南亚市场!
亚马逊新型小红旗:亚马逊新型小红旗
没有评论:
发表评论