Tokitsukaze and Cats
思路1
对没有只猫我们只需要枚举它的四个方向,看一下有没有猫,如果有他们就会公用一条边,需要注意的是这个方法会重复计算同一条共用的边,最后除2就行
代码1
#include <bits/stdc++.h>
typedef std::pair<int, int> pii;
#define INF 0x3f3f3f3f
#define MOD 998244353
using i64 = long long;
const int N = 1e5+5;
void solve(){
int n, m, k, ans = 0, cnt = 0;
std::cin >> n >> m >> k;
std::queue<pii> q;
std::vector t(n+2, std::vector<int>(m+2));
for (int i = 0; i < k; i++){
int a, b;
std::cin >> a >> b;
t[a][b] = 1;
q.push(pii(a, b));
ans += 4;
}
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
while (!q.empty()){
auto [x, y] = q.front();
q.pop();
for (int i = 0; i < 4; i++){
int dx = x + dir[i][0];
int dy = y + dir[i][1];
if (t[dx][dy] == 1){
cnt++;
}
}
}
std::cout << (ans - cnt/2) << '\n';
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(2);
int t = 1, i;
for (i = 0; i < t; i++){
solve();
}
return 0;
}
思路2
看的别人的代码发现,其实可以用高中的知识,每一只猫都只看它的右上或左下,这样就避免了重复枚举的问题
代码2
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int i,j,k,n,m,t;
int f[666][666],res;
vector<pair<int,int> > d={{1,0},{-1,0},{0,1},{0,-1}};
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin>>n>>m>>t;
res=t*4;
while(t--){
cin>>i>>j;
f[i][j]=1;
}
for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(f[i][j]){
if(f[i+1][j])res--;
if(f[i][j+1])res--;
}
cout<<res;
}
标签:std,int,cin,long,2024,牛客,vector,集训营,dir
From: https://www.cnblogs.com/califeee/p/18637248