c语言实现 /** 1 2 4 7 3 5 8 11 6 9 12 14 10 13 15 16 */ #include <stdio.h> #include <stdlib.h> const int N=1010; int q[N][N]; /* * */ int main(int argc, char** argv) { int n =4; int i = 1,j=1; for (int k = 1; k <= n*n; k++) { q[i][j] = k; if (i == n) { i = 1+j; j = n; } else if (j==1) { j = i+1; i = 1; } else { i++; j--; } } for (int i=1;i<=n;i++,puts("")) for (int j =1;j<=n;j++) printf("%d ", q[i][j]); return 0; }
个人php实现php
<?php $arr = []; $n = 0; $i = 0; $j = 0; for ($e=0;$e<4;$e++) { for ($d=0;$d<4;$d++) { if (empty($arr[$e][$d])) { $n++; $arr[$e][$d] = $n; } $j = $d; $i = $e; if ($j == 0) { $n++; } while ($j - 1 >= 0) { if ($i < 3) { if (empty($arr[$i+1][$j-1])) { $n++; $arr[$i+1][$j-1] = $n; } $i++; $j--; } else { //$prev = $n; break;; } } } } var_dump($arr);
php的实现未经优化,c语言的实现是O(n)的算法
其实思路都是同样的,不过c语言的版本注意了两个优化的点优化
第一次输出,都是输出以下,都是斜着输出的code
1 2 4 7 3 5 8 6 9 10
而后我初步想的办法,是把后面的补上,因此又作了一个循环,其实不须要,后来发现了一些规律,能够优化的方向io
1.第二行开始,每次缺的都是从最后一个开始的,也就是第二行的第四位,因此,只要从第二行第四位开始输出就能够了,省去了外层的一层遍历变量
2.c语言的算法有一个更巧妙的地方,是我没注意到的,第一行的7和和最后一行的10是成对角线关系的,因此循环
if (i == n) { i = 1+j; j = n; }
此判断是很是巧妙地,没有浪费多余的变量解决了这个问题,是优化1更进一步的方案遍历
else if (j==1) { j = i+1; i = 1; }
再解释下这个算法的核心,就是这个临界判断,当到了输出边界,也就是竖排在最左边的位置的时候,要进行i,j的重置gc