题解:P11001 [蓝桥杯 2024 省 Python B] 连连看

题目传送门
洛谷题解

虽然这是一道 Python 题,但我还是忍不住写了一个 C++ 题解。

思路讲解

仔细读题,不难发现。如果 ∣ a − c ∣ = ∣ b − d ∣ > 0 |a-c|=|b-d|>0 ac=bd>0,则说明 A a , b A_{a,b} Aa,b A c , d A_{c,d} Ac,d 同处一条对角线,且不是同一个点。

而要使 A a , b A_{a,b} Aa,b A c , d A_{c,d} Ac,d 在同一条对角线上,要么 a − b = c − d a-b=c-d ab=cd,要么 a + b = c + d a+b=c+d a+b=c+d

所以,我们可以使用两个 map 来统计两个对角线上的数值的个数,在输入时,将答案加上除该点以外的前面的在该点两条对角线上与它相等的点的个数,将该点加入到两个 map 中。

最后将答案乘 2 2 2 输出即可,因为一对点反过来,能作为一对新的点。

代码实现

#include 
using namespace std;
map <pair<int,int>,int> mp1,mp2;
int main(){
    int n,m,ans=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            int a;
            cin>>a;
            ans+=mp1[make_pair(a,i-j)]++,ans+=mp2[make_pair(a,i+j)]++;//先加答案,再加map
        }
    cout<<ans*2;//乘2输出
    return 0;
}

完结撒花!

你可能感兴趣的:(蓝桥杯,算法)