P9582 方格
签到题
因为值域很小,考虑对值域动手。
对于每一种数字,存储他出现的次数,那么根据排列组合,假设当前的数有 个,根据排列组合,我们就知道最多可以可以组合出来 种。
然后我们再遍历一次这个矩阵,所谓公共边其实就是上下左右四个点。按照题意排除掉不满足的就做完了。
#include<bits/stdc++.h>
using namespace std;
const int N =5001;
#define int long long
int a[N][N],t[N],ans;
signed main()
{
// freopen("square5.in","r",stdin);
// freopen("ans.out","w",stdout);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lld",&a[i][j]),t[a[i][j]]++;
for(int i=1;i<=9;i++)
ans+=t[i]*(t[i]-1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(a[i][j]==a[i-1][j]) ans--;
if(a[i][j]==a[i][j-1]) ans--;
if(a[i][j]==a[i+1][j]) ans--;
if(a[i][j]==a[i][j+1]) ans--;
}
cout<<ans<<endl;
return 0;
}
/*
start: 2023.8.26 18:45
总的减去分的,没了。
按着值域做。
end: 2023.8.26 18:56
*/

浙公网安备 33010602011771号