一时技痒 不用模拟第一印象的构造 通过三个观察得来的规律解决N^2个往返接力问题
问题原题 见银河使者的随笔 http://www.cnblogs.com/nokiaguy/archive/2009/07/24/1530139.html
第一印象 我得到了和他一样的解法,就是用斜切片,每一层的 x-1和y+1 来控制顺序写数字的笔落在哪一个坐标。
但是根据一段时间的观察 我发现了几个规律 可以让我们不用模拟整个顺序的流
首先我们观察每一个切片
我们发现 在 n,n 坐标上的每一个数字都是这个切片对称 而且是平均值。 经过简单的计算 我们发现 1-n个切片的平均值 都是(n*n +1)/2
继续观察 又发现规律了。 这个矩阵对角对称的任意两个格子 正好是距离整个数列中心距离相等的两点 比如1和100 20和81 他们的和必为 max*max +1
这样我们只要能推算出某一行或者某一列的值 就可以通过上面两个特征来生成整个矩阵了哦
但是这个矩阵的行列太乱了 很难找出规律 这个时候就要考虑更简单的模型
我们看看非首尾接力的矩阵
1
1 2
3
1 2 4
3 5
6
1 2 4 7
3 5 8
6 9
10
有没有发现 粗体的数字 刚好是之前所有斜切片的总和?
那么 顺序矩阵和接力矩阵 有什么异同呢?
我们可以把接力矩阵当成隔行反转的顺序矩阵。这样我们就得到了一个在 x,y轴上摆动的参考值。 有了参考值 就可以根据前两点进行矩阵生成了
Code
解法有很多种 这种无疑是很生涩的。 作为面试题目的话 并不建议写这种考官很难理解的解法,会有小鞋
作为头脑风暴 防止老年痴呆 这个还是有一定意义的
第一印象 我得到了和他一样的解法,就是用斜切片,每一层的 x-1和y+1 来控制顺序写数字的笔落在哪一个坐标。
但是根据一段时间的观察 我发现了几个规律 可以让我们不用模拟整个顺序的流
首先我们观察每一个切片
1 | 3 | 4 | 10 | 11 | 21 | 22 | 36 | 37 | 55 |
2 | 5 | 9 | 12 | 20 | 23 | 35 | 38 | 54 | 56 |
6 | 8 | 13 | 19 | 24 | 34 | 39 | 53 | 57 | 72 |
7 | 14 | 18 | 25 | 33 | 40 | 52 | 58 | 71 | 73 |
15 | 17 | 26 | 32 | 41 | 51 | 59 | 70 | 74 | 85 |
16 | 27 | 31 | 42 | 50 | 60 | 69 | 75 | 84 | 86 |
28 | 30 | 43 | 49 | 61 | 68 | 76 | 83 | 87 | 94 |
29 | 44 | 48 | 62 | 67 | 77 | 82 | 88 | 93 | 95 |
45 | 47 | 63 | 66 | 78 | 81 | 89 | 92 | 96 | 99 |
46 | 64 | 65 | 79 | 80 | 90 | 91 | 97 | 98 | 100 |
继续观察 又发现规律了。 这个矩阵对角对称的任意两个格子 正好是距离整个数列中心距离相等的两点 比如1和100 20和81 他们的和必为 max*max +1
这样我们只要能推算出某一行或者某一列的值 就可以通过上面两个特征来生成整个矩阵了哦
但是这个矩阵的行列太乱了 很难找出规律 这个时候就要考虑更简单的模型
我们看看非首尾接力的矩阵
1
1 2
3
1 2 4
3 5
6
1 2 4 7
3 5 8
6 9
10
有没有发现 粗体的数字 刚好是之前所有斜切片的总和?
那么 顺序矩阵和接力矩阵 有什么异同呢?
1 | 3 | 4 | 10 | 11 | 21 | 22 | 36 | 37 | 55 |
2 | 5 | 9 | 12 | 20 | 23 | 35 | 38 | 54 | 56 |
6 | 8 | 13 | 19 | 24 | 34 | 39 | 53 | 57 | 72 |
7 | 14 | 18 | 25 | 33 | 40 | 52 | 58 | 71 | 73 |
15 | 17 | 26 | 32 | 41 | 51 | 59 | 70 | 74 | 85 |
16 | 27 | 31 | 42 | 50 | 60 | 69 | 75 | 84 | 86 |
28 | 30 | 43 | 49 | 61 | 68 | 76 | 83 | 87 | 94 |
29 | 44 | 48 | 62 | 67 | 77 | 82 | 88 | 93 | 95 |
45 | 47 | 63 | 66 | 78 | 81 | 89 | 92 | 96 | 99 |
46 | 64 | 65 | 79 | 80 | 90 | 91 | 97 | 98 | 100 |
我们可以把接力矩阵当成隔行反转的顺序矩阵。这样我们就得到了一个在 x,y轴上摆动的参考值。 有了参考值 就可以根据前两点进行矩阵生成了
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
解法有很多种 这种无疑是很生涩的。 作为面试题目的话 并不建议写这种考官很难理解的解法,会有小鞋
作为头脑风暴 防止老年痴呆 这个还是有一定意义的