分享一个有趣的算法题

发布时间:2021-05-17

今天,在QQ群看到一个有趣的算法题,简单写了一下,本文做一个记录。

题目

做如下一个数据结构,给定N为行列数量(比如5)

1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25

然后给定索引X和Y,用以查询第X行,第Y列,然后将两个结果的元素相加(交叉的元素只需要加一次)即为结果。

分析

乍一看好像没有什么规律,但仔细看看便会发现,将表格中的元素位置依次相连起来,便得出了规律,从(0,0)下标开始算,每次相连起来的斜线上,每个点的下标之和都是一样的,只不过如果是横向增加则是右上斜向左下,然后到了纵向增加,然后方向又是左下斜向右上了。所以,我们只需要确定当前点位下标之和即可得到所有点位,然后反向做同样的操作即可得到下一条线

规律图

解题

根据上面分析出的规律,那就很容易写出代码如下

int n = 5;
int x = 1;
int y = 2;
int current=1;
bool rev=true;

int[,] nums = new int[n,n];

for(int l = 0; l < n + n - 1; l++){
    for(int a = 0; a <= l && a < n; a++){
        for(int b = 0; b <= l && b < n; b++){
            if(a + b == l){
                if(!rev){      
                    nums[a,b] = current;             
                }
                else{
                    nums[b,a] = current;
                }
                current++;
            }
        }
    }
    rev=!rev;
}

int[] xx = new int[n];
int[] yy = new int[n];

for(int a = 0; a < n; a++){
    xx[a] = nums[x-1,a];
}

for(int a = 0; a < n; a++){
    yy[a] = nums[a,y-1];
}

var result = xx.Concat(yy).Distinct().ToArray();

int sum=0;

foreach(var item in result){
   sum += item;
}

Console.WriteLine("数组为:");
Console.WriteLine(nums);
Console.WriteLine($"第{x}行,第{y}列结果为:");
Console.WriteLine(result);
Console.WriteLine($"结果为:{sum}");
其他阅读

删除 Office 中毒瘤:Office Plus 插件

在某次更新之后,Office Plus 插件就会自动添加到 Word、Excel、PowerPoint 中,在我看来算是一个毒瘤,极大地拖慢了 Office 的运行,本文教大家怎么删除 Office Plus 这个毒瘤。

查看原文

什么是上帝对象

上帝对象(God Object)是面向对象编程(OOP)中一种特殊现象,在面向对象编程中,我们把逻辑和数据封装成一个个对象,每个对象各司其职,最终实现我们的业务,但是如果业务复杂的情况下,可能会出现一个对象封装太多的数据或者担任了太多的职责的情况,这样的对象我们称为上帝对象。

查看原文

Nginx重定向HTTP到HTTPS

HTTP协议以纯文本形式进行数据的交互,数据明文传输,容易被监听,窃取和伪造,HTTPS在HTTP的基础上,使用了TLS/SSL对通信过程进行加密,数据得到了有效的保护,就算被拦截到也无法获取信息,更没法实施中间人攻击。本文将会介绍如何在Nginx中配置HTTP重定向到HTTPS。

查看原文

Open Graph优化SEO

Open Graph(OG)协议作为社交分享优化的核心技术,不仅决定了内容在社交媒体平台的展示效果,还间接影响搜索引擎优化(SEO)的表现。本文将从作用解析、核心标签配置到动态生成策略,全面介绍 Open Graph 的应用。

查看原文

C#中new和override的区别

在C#编程语言中,new 和 override 是两个重要的关键字,它们用于控制类成员方法的行为。在面向对象编程(OOP)中,理解这两个关键字的区别和用法,对于编写清晰、可维护和高效的代码至关重要。

查看原文