java下蛇形回环矩阵的实现

前文废话:这个问题据说是腾讯之前的一道笔试题,由于当时没认真看,现在记不清这种矩阵是不是叫“蛇形回环矩阵”......请大家直接看图1,就是那个样子的矩阵。

问题描述:输入一个N,实现N×N的蛇形回环矩阵(即图1类型)

(N=5时的蛇形回环矩阵)

我们先把N为奇数和N为偶数的情况分开。先来看N=3、5、7时的该类矩阵是什么情况:

             

看上去彼此之间并无规律,对这道题最简单粗暴的解法似乎就是构建一个二维数组,然后按人的正常思维向里填数字构建。

但是——如果用(最大数+1)减去每个数,那么这三个矩阵就变成了:

                

现在就有了规律。

而N为偶数时,彼此之间也是这样的规律。

所以只要得到N=K-2时的矩阵,就能通过在原先的每行前添一列,后面添一列,然后上面添一行,下面添一行,就可以了。

为了实现这个能在前面插入的功能,构建二维的ArrayList。

实现的函数代码如下:

 1 //判断N是偶数还是奇数,N为偶数时num=count,为奇数时num = count-1
 2     public static void getArray(int num,int count){
 3         ArrayList<ArrayList> listAll = new ArrayList<ArrayList>(count);//二维Arraylist
 4         if(num != count){//奇数时先构建最核心的1
 5             ArrayList start = new ArrayList(count);
 6             start.add(1);
 7             listAll.add(start);
 8         }
 9         for(int i=0;i<num/2;i++){
10             ArrayList listHead = new ArrayList();//构建要加的第一行
11             ArrayList listEnd = new ArrayList();//构建要加的最末行
12             int k;
13             if(num !=count)
14                 k = 2*i+3;
15             else
16                 k = 2*i+2;
17             for(int j=0;j<k;j++){
18                 listHead.add(k*k-j);//填充要加的第一行
19                 listEnd.add((k-2)*(k-2)+k-1+j);//填充要加的最末行
20                 if(j<(k-2)){//原有的每行加头加尾
21                     ArrayList listTem = new ArrayList();
22                     listTem = listAll.get(j);
23                     listTem.add(0,(k-2)*(k-2)+1+j);
24                     listTem.add(k*k-k-j);
25                     listAll.set(j,listTem);
26                 }
27             }
28             listAll.add(0,listHead);//加入第一行
29             listAll.add(listEnd);//加入最末行
30         }
31 //输出
32         for(int i=0;i<count;i++){
33             ArrayList listTem = new ArrayList();
34             listTem = listAll.get(i);
35             for(Iterator iter = listTem.iterator();iter.hasNext();){
36                 int lastValue = count*count+1 - (int)iter.next();
37 //没有标准化格式的输出
38 //                System.out.print(lastValue+" ");
39                 System.out.printf("%3d ",lastValue);
40             }
41             System.out.println();
42         }
43     }

这里把N=偶数和N=奇数时分开构建开头的情况。其实就矩阵来看,N为偶数与N为奇数之间也可以通过矩阵转置来实现。但开头分开也比较简单实现,所以就用这种途径了。完整代码实现见github:https://github.com/Pengyiqing/java_practice

时间: 2024-09-28 00:03:18

java下蛇形回环矩阵的实现的相关文章

(九)ORBSLAM回环检测之几何验证

ORBSLAM2回环检测之几何验证简介 回环检测的目的是找到当前场景在历史中是否出现过,如果出现过,那会给我们提供一个非常强的约束条件,把我们偏离很多的轨迹一下子修正到正确的位置上.当然,这么好的东西,有利自然就有弊.万一我们检测出来的回环不是真正的回环,也就是说我们认错了地方,这种时候提供的回环约束会导致轨迹被错误地“修正”了,结果就是估计的轨迹跟真实的轨迹相差十万八千里,这显然是不可接受的. 因此,回环检测的正确性就显得非常重要.我们会宁愿不要回环约束,也不要一个错误的回环约束.所以ORBS

回环栅栏CyclicBarrier

通过它可以实现让一组线程等待至某个状态之后再全部同时执行.叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用.我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了. CyclicBarrier类位于java.util.concurrent包下,CyclicBarrier提供2个构造器: ? 1 2 3 4 5 public CyclicBarrier(int parties, Runnable barrierAction)

ORB-SLAM(六)回环检测

上一篇提到,无论在单目.双目还是RGBD中,追踪得到的位姿都是有误差的.随着路径的不断延伸,前面帧的误差会一直传递到后面去,导致最后一帧的位姿在世界坐标系里的误差有可能非常大.除了利用优化方法在局部和全局调整位姿,也可以利用回环检测(loop closure)来优化位姿. 这件事情就好比一个人走在陌生的城市里,一开始还能分清东南西北,但随着在小街小巷转来转去,已经不知道自己在什么地方了.通过认真辨识周边环境,他可以建立起局部的地图信息(局部优化).再回忆以前走过的路径,他可以纠正一些以前的地图信

ATS回环检测

ATS的回环检测是通过判断本机ip是否出现在请求头中的Via头来实现. Machine::Machine(char const* the_hostname, sockaddr const* addr):函数初始化了本机的入口ip. 如果没有配置proxy.local.incoming_ip_to_bind,这个函数第二个参数是地址存的值是一个空的sockaddr结构体.函数调用了getifaddrs,这个api可以获取系统所有的网络接口信息,存到一个ifaddrs结构体中,这个机构体是一个链表结

武汉科技大学ACM:1008: 零起点学算法64——回型矩阵

Problem Description 输出n*m的回型矩阵 Input 多组测试数据 每组输入2个整数 n和m(不大于20) Output 输出n*m的回型矩阵,要求左上角元素是1,(每个元素占2个位置,靠右) Sample Input 4 3 Sample Output 1 2 3 10 11 4 9 12 5 8 7 6 1 #include<iostream> 2 #include<string.h> 3 #include<iomanip> 4 using na

thread_CyclicBarrier回环栅栏

CyclicBarrier回环栅栏,字面意思是可循环使用(Cyclic)的屏障(Barrier).通过它可以实现让一组线程等待至某个状态之后再全部同时执行. 它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活. 叫做回环是因为当所有等待线程都被释放以后,可以被重用.我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了. await()            在所有

地址回环

地址回环: 可以解决oracle10g 在更换频繁更换ip地址的情况下,用浏览器方式登陆数据的问题 控制面板--添加硬件--网络适配器,即添加一个本地连接,ip地址填写原地址即可 (添加本地连接的方法需要完善) win7中添加回环网络适配器的方法 Microsoft Loopback Adapter (微软回环网卡)类似一个虚拟网卡,能够被安装在一个没有网卡或者要用于测试多个宿主环境的 Windows 上.相信不少 ITPro 对此是相当熟悉的.但是在 Widnows 7 上按照往常的方法使用添

嗅探回环地址数据的工具RawCap

本地回环地址,不属于任何一个有类别地址类.它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口.在windows操作系统中也有相似的定义,所以通常在不安装网卡前就可以ping通这个本地回环地址.一般都会用来检查本地网络协议.基本数据接口等是否正常的. Wireshark等嗅探工具嗅探的是经过网卡的数据,而回环地址数据不经过网卡,因此Wireshark无法获取相关的数据. RawCap是Windows下的嗅探工具,使用原始套接字实现,可以嗅探到回环地址的数据.

Localhost 回环IP 127.0.0.1

LocalHost 127.0.0.1是一个保留地址,用于本地软件测试以及本地进程间通信, 也叫回环IP.回环地址.回送地址(loopback address).无论什么程序,一旦使 用回环IP发送数据,协议软件立即返回,不进行任何网络传输. Linux下发现如果ping自己的IP不通,则可使用如下指令打开本地回环IP: ifconfig lo 127.0.0.1 up 打开后不但能ping通本机的IP,还能ping通127.0.0.1 .