算法学习题,导师说5行代码搞定,我硬是做不出来,会的教一下

ACFJO
BEIN
DHM
GL
K

题目是用代码在console输出以下字母排列,看起来好像有规律,但脑壳想破都没想出来,看谁会的给个答案,java、c#、c、vb都行

供参考:

#include<stdio.h>

void foo(unsigned n)
{
     for(unsigned r=0,c=0;r!=n;r+c+1==n?(++r,c=0):++c)
         printf("%c%c",((r+c+1)*(r+c)/2+c+'A'),(r+c+1==n)?'\n':' ');
}

int main()
{
     unsigned n;
     scanf("%u",&n);
     foo(n);
     
     return 0;
}

我导师给的答案:

using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 1; i < 6; i++)
            {
                for (int j = 1; j <= 6 - i; j++)
                {
                    Console.Write(((char)('A' + (i + j - 1) * (i + j - 2) / 2 + j - 1)));
                }
                Console.WriteLine();
            }
            Console.ReadLine();
        }
    }
}

主体代码4行,运行结果:

img

我感觉我导师给的答案与qzjhjxj大师的答案原理是一样的,不同的地方是,一个是c#代码,一个是c代码,另一个不同的地方是,我导师给的以内外for循环,而上面大师是单循环控制变量进行行列换算,但结果应该都是一样的,我没进行验证。

至于什么原理,我导师说用的是几何原理,究竟是什么几何原理?是三角形原理还是平行四边形原理或者其它原理,我就不知道了,反正我觉得很历害!

规律就是下一行输出是上一行第二个字符开始遍历,遍历到的字符ASCII-1对应的字符,帮助到你能点个采纳吗,谢谢~~
A【B】C【E】F【I】J【N】O
B【D】E【H】I【M】N
D【G】H【L】M
G【K】H
K

改成可以传测试用例的了,不需要人工输入

img

using System;
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                var s = args[0];
                Console.WriteLine(s);
                while (s.Length > 1)
                {
                    var t = "";
                    for (var i = 1; i < s.Length; i++)
                    {
                        t += (char)((int)s[i] - 1);
                    }
                    Console.WriteLine(t);
                    s = t;
                }
            }
        }
    }
}

难道要凭空就输出吗。。。总得有一个是定义好的吧

不能解答的码友也可以留言关注,也许有高手会给出答案,我们共同学习。
不过我感觉,好像已有高手给出答案,各位可以验证一下。

听说此题用间距法也可以做出来,不知有没有哪位神勇能实现

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^