题解:P11001 [蓝桥杯 2024 省 Python B] 连连看
给定一个
对于每一个格子
考虑维护每一条斜着的线上元素为
在维护
- 在维护反对角线时下标
i-j 可能为负数,所以需要加一个偏移量。 - 在维护正对角线和反对角线时的下标
i+j 和i-j+m 可能会超出n 或m ,所以数组要开到两倍大小。
得到了 c[0][i+j][x]-1+c[1][i-j+m][x]-1。
代码就很容易写出来了:
#include<bits/stdc++.h>
using namespace std;
using LL=long long;
const int N=2005;
int n,m,a[N][N],c[2][N][N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
c[0][i+j][a[i][j]]++;
c[1][i-j+m][a[i][j]]++;
}
}
LL s=0;
for(int i=1;i<=n;i++){
for(int j=1,x;j<=m;j++){
x=a[i][j];
s+=max(0,c[0][i+j][x]-1)+max(0,c[1][i-j+m][x]-1);
}
}
cout<<s;
return 0;
}