程序就是数据结构加上算法
首先来解决一下汉诺塔的问题:
就是有三个柱子A,B,C其中A柱子上有64个圆盘,这个圆盘是按照从小到大的串在A这个柱子上的,大的在下面,现在要求把A柱子上的这些圆盘移动到C柱子上,B柱子可以作为中转的柱子,要求就是每次只能移动一个,并且在移动的过程中不能出现在同一个柱子上,小的圆盘在大的圆盘下面的情况。这个怎么移动呢,咱们可以假设只有一个圆盘的话直接就A->C就可以了,咱们接着假设两个圆盘,那么两个圆盘咋办呢,咱们也很好解决,咱们可以把A柱子上的第一个移动到B柱子上,然后再把A柱子上剩下的一个咱们直接移动到C上面,再然后移动B上的圆盘到A上面,即A->B,A->C,B->C好了,到这里咱们就好了,他不是64个圆盘吗?那就好办了,我先把上面的63个看成是一个,只要把这63个按照从大到小的顺序移动到B上,然后再把第64个移动到C上就可以。同类63个也可以分成两部分。这样一直分下去,就会变成了第一个和第二个。这里有个递归的思想就是你可以不用管中间怎么做的,我就知道到最后是怎么走的就可以了,所以咱们就可以这么操作一下了。增加一下代码了
private static void method01(int i, char a, char b, char c) { /** * @Method method01 * @Author yanglimeng1 * @Version 1.0 * @Description * @param i 圆盘个数 * @param a A柱子 * @param b B柱子 * @param c C柱子 * @Return void * @Exception * @Date 2019/8/23 16:49 */ if(i==1){ System.out.println(a+"->"+c); }else { method01(i-1,a,c,b); System.out.println(a+"->"+c); method01(i-1,b,a,c); } }
接下来再说一下稀疏数组
其实稀疏数组很简单就是将本来是一个二维数组里面有效的数据放到一个新的二维数组中,这个新的二维数组就是稀疏数组,这个是怎么放的呢?首先咱们明确一下这个稀疏数组其实就是三列,这三列咱们是把第一列是保存的就是这个有效数据再原来的二维数组存的行,第二列呢就是有效数据在原来的数组中存在的列,第三列自然就是咱们这个有效数据的值了。现在知道有三列了那么有多少行了,这个就根据咱们原来的数组中有多少个有效的数据了,如果有n个有效的数据,那么咱们这个稀疏数据就是n+1行,为啥是n+1行呢,这是因为咱们在稀疏数组的第一行保存一下咱们原来的二维数组由多少行(对应咱们稀疏矩阵中第一行第一列的值),多少列(对应咱们稀疏矩阵中第一行第二列的值),那么稀疏矩阵的第一行的第三列呢就是咱们所有有效值的和,这样咱们可以通过咱们稀疏数组的第一行第一列很容易恢复到原来的数组,如果没有第一行就没有办法恢复原来的,因为稀疏数组比较简单就不再上代码了,自行脑补一下代码就可以了。