此算法题让我想了8000年,彻夜未眠,有请你解惑

码友都知道,遇到复杂的问题,要很多行代码、要if语句或?:运算符等条件句,也可能要创建数组来存储临时运算,为了简化算法,也可能要用到递归等算法。然而,看到头都麻的下题,我的导师竟然不用条件句、不用递归、也不用数组等,就那么几行代码就实现,如果说,我之前提的那两个问题的不用条件句可以理解,为何本题也不用条件句,我怎么都想不能,究竟是如何实现的呢?什么原理呢?有神牛知道的可否告诉我?

要求如下图:

img

我导师的给出的代码

        static int ggg(int A1) { return ((1 - A1 - Math.Abs(A1)) + Math.Abs((1 - A1 - Math.Abs(A1))) - 2) / -2; }
        static int hhh(int u,int n) { return Convert.ToInt32((u * 6 + 3 - n * 9) / 2.0 * n); }

        static void twine(int u)
        {
            for (int i = 0; i < u; i++)
            {
                int x1 =u- i;
                int x2 = i*2-u+1 ;
                int ei = hhh(u,(u-1-i));
                for (int j = 0; j <= i; j++)
                {
                    int y1 = j * 2 + 1;
                    int y2 = u-1- j;

                    int g1 = ggg(i + 1 - y1) * ggg(y2 + 1 - i);
                    int g2= ggg(j + 1 - x1) * ggg(x2 + 1 - j);
                    int n = g1 * (hhh(u,j) + (y2 - y1 + 1) * 2 + (y2 - i));
                    n += g2 *( ei + (x2 - x1 + 1) + (x2 - j))+(1 - g1 - g2) * (hhh(u, (i - j)) + i - (i - j) * 2);

                    Console.Write("{0,4}", n+1);
                }
                Console.WriteLine();
            }
        }

那么多种分支情况,为什么没有条件句?

这是找规律问题

这是之前两个提问,我导师也同样没用条件句、没有用数组、没有用集合,并且主体代码没超过5行,不过现在我明白了

img

img

我是我导师提供代码的运行结果

img

各位码友,谁最先给出正确原理解释,就采纳谁的答案,加油哦!

还有这种操作? 我都写过

不是没有条件语句啊,abs本质就是一个条件语句

有码友说,abs本质上是条件句,行吧,我放没有abs,没有if,没有 ?:,没有用数组的代码出来
阁下意下如何?

        static int aaa(int n) { return (int)Math.Sqrt(n*n); }
        static int ggg(int n) { return ((1 - n - aaa(n)) + aaa((1 - n - aaa(n))) - 2) / -2; }
        static int hhh(int u,int n) { return Convert.ToInt32((u * 6 + 3 - n * 9) / 2.0 * n); }

        static void twine(int u)
        {
            for (int i = 0; i < u; i++)
            {
                int x1 =u- i;
                int x2 = i*2-u+1 ;
                int ei = hhh(u,(u-1-i));
                for (int j = 0; j <= i; j++)
                {
                    int y1 = j * 2 + 1;
                    int y2 = u-1- j;

                    int g1 = ggg(i + 1 - y1) * ggg(y2 + 1 - i);
                    int g2= ggg(j + 1 - x1) * ggg(x2 + 1 - j);
                    int n = g1 * (hhh(u,j) + (y2 - y1 + 1) * 2 + (y2 - i));
                    n += g2 *( ei + (x2 - x1 + 1) + (x2 - j))+(1 - g1 - g2) * (hhh(u, (i - j)) + i - (i - j) * 2);

                    Console.Write("{0,4}", n+1);
                }
                Console.WriteLine();
            }
        }

你不觉得 sqrt(n*n) 这样的东西写着很丑吗?

我的导师竟然不用条件句、不用递归、也不用数组等,就那么几行代码就实现

来来来,就那么几行。

好强!!你的导师好强!
他是天地万物之灵秀!他是历史缺失的拼图!他是文明遗漏的珍宝!他是限量款!他是绝版独苗!他是天之骄子!他是最后的晚餐!他是电!!!他是光!!!