资讯专栏INFORMATION COLUMN

赛码模拟题:蛇形填数 SnakeSquare (Java 8)

lk20150415 / 1348人阅读

摘要:题目在方阵里填入要求填成蛇形。填数的循环按照走。重点是控制蛇的方向和移动范围。假设表示行数,表示列数垂直向下,递增,不变,到达最下方变水平,递增变为递减。还有要注意矩阵下标和坐标的区别,原点位置不同,不建议用作为变量名,易混淆。

题目:
在nn方阵里填入1,2,...,nn,要求填成蛇形。例如n=4时方阵为:

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

解法:
这题感觉挺麻烦的,要对整个矩阵的形成过程有清晰的认识。

填数的循环按照Step1->Step2->Step3->Step4走。重点是控制蛇的方向和移动范围。

我用了一个布尔控制蛇垂直走还是水平走,
另外一个布尔控制在当前方向递增递减,
另外用四个变量控制蛇上下左右活动范围。

假设j表示行数,i表示列数:
S1: 垂直向下,j递增,i不变,到达最下方变水平,递增变为递减。
S2: 水平向左,j不变,i递减,到达最左方变垂直,递减还是递减。
S3:垂直向上, j递减,i不变,到达最上方变水平,递减变递增。
S4: 水平向右,j不变,i递增,到达(最右-1)列时变垂直进入下一个内环,递增还是递增。

尤其要注意分清行数列数和水平垂直方向的关系:水平走是列数变,垂直走是行数变。

还有要注意矩阵下标和x,y坐标的区别,原点位置不同,不建议用x,y作为变量名,易混淆。

代码:

import java.util.*;

public class Main {

    private static void snakeSquare(int n) {
        int[][] square = new int[n][n];
        // true is increment, false is decrement
        boolean delta = true;

        // ture is going through row j(vertically), false is going through column i (horizontally)
        boolean direction = true;
        // R,r是上下边界值;C,c是左右边界值
        int R = n-1, C = n-1, r = 0, c = 0;
        for(int i = n-1, j = 0,counter = 0 ; counter < n*n;counter++){
            square[j][i] = counter + 1;
            // 垂直往下
            if(direction && delta) {
                j+=1;
                if(j == C) {direction = !direction;delta = !delta;}

            }
            //垂直向上
            else if(direction && !delta) {
                j -= 1;
                if(j == c) {direction = !direction;delta = !delta;}
            }
            //水平向右
            else if(!direction && delta) {
                i += 1;
                if(i == R-1) {
                    direction = !direction;
                    //水平向右结束后说明要进入下一个内环,要改变边界范围
                    C -= 1;R -= 1;r += 1;c += 1;
                }
            }
            //水平向左
            else {
                i -= 1;
                if(i == r)
                    direction = !direction;
            }
        }

        for(int i = 0 ; i < n; i++){
            for(int j = 0; j < n;j++)
                System.out.print(square[i][j] + " ");
            System.out.printf("%n");
        }

    }

    public static void main(String[] args) {
    // write your code here
        Scanner scn = new Scanner(System.in);
        while(scn.hasNextInt())
            snakeSquare(scn.nextInt());
        scn.close();
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66072.html

相关文章

  • 赛码拟题:股神 stockmaster (java8)

    摘要:我认为赛码的题挺有趣的其实,所以还是值得做。还有更快的方法,举例发现股价和天数之间是有一些规律的发现同一递增周期内股价与天数的差值相同。接下来只要能总结出天数和差值的关系就能知道股价了。 题目: 股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天...依此类推。为方便计算,假设每次涨和跌皆为1,股票初始单价也为1,请计算买股票的第n天每股股票值多少钱?例子...

    张汉庆 评论0 收藏0
  • javascript生成回型矩阵/蛇形矩阵

    摘要:回型蛇形矩阵形式上述这种形式即为蛇形矩阵。例如的中间公约数为,所以为三行三列。若为则中间公约数分别是,所以为四行五列。之后在根据行列中比较小的那个来判断有几层回字型。源码在浏览器控制台即可调用函数。 回型/蛇形矩阵形式 1 2 3 8 9 4 7 6 5 上述这种形式即为蛇形矩阵。 原文首先发布于 TinyTin的自留地 解决思路 给定一个数字 n(为最终值例如上述...

    n7then 评论0 收藏0
  • 赛码网编程题--“股神”

    摘要:昨天看到了赛码在线编程的一道题,热度很高。赛码股神题目是这样的涨一天,跌一天,涨两天,跌一天看似很有规律,看似很简单。给大神跪了。。。大神们的解法简单易懂的方法以上是最高票的答案。。。 昨天看到了赛码在线编程的一道题,热度很高。赛码-股神题目是这样的: showImg(https://segmentfault.com/img/bVbgMXd?w=1053&h=569); 涨一天,跌一天...

    SexySix 评论0 收藏0
  • 《AI之矛》(1)【数独Agent】

    摘要:而此处针对进一步的搜索,有两个问题需要考虑如何选取搜索起点方格确定哪种搜索策略深度优先搜索,广度优先搜索关于第一个问题,无论选择哪个方格起始搜索,对于能否解决问题来说并不存在差异。 Github仓库地址 学习是为了寻找解决问题的答案,若脱离了问题只为知晓而进行的打call,那么随时间流逝所沉淀下来的,估计就只有重在参与的虚幻存在感了,自学的人就更应善于发现可供解决的问题。为了入门AI,...

    CatalpaFlat 评论0 收藏0
  • 前端开发应届生面试指南(含各大公司具体指南及面试真题)

    摘要:先介绍一下本人应届前端开发一枚,非科班出身,专业是化学,大学期间开始自学前端开发,在今年春招实习和秋招的时候投了一些公司,拿到一些京东拼多多虎牙等,总体来说还算满意,特地写一篇文章来总结一下面试的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介绍一下本人应届前端开发一枚,非科班出身,专业是化学...

    sunnyxd 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<