Link:
前两天由于食物中毒现在还要每天挂一天的水
只好晚上回来随便找套题做做找找感觉了o(╯□╰)o
A:
看到直接大力模拟了
但有一个更简便的方法,复杂度为$O(被禁止的格子数)$
如果将每个黑格子上下左右四条线都染上色
可以发现一个格子最终无法被“净化”当且仅当其被左右/上下来向都染过色,所以将最终无法净化的格子合并是一个矩形
这样最终答案为:黑格子出现的行的个数*黑格子出现的列的个数
此时复杂度就变成与黑格子个数相关了
#include <bits/stdc++.h> using namespace std; #define X first #define Y second typedef long long ll; typedef pair<int,int> P; int n,m,cnt,vis[20][20];char dat[20][20]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%s",dat[i]+1); for(int i=1;i<=n;i++) { bool f=0; for(int j=1;j<=m;j++) if(dat[i][j]=='S'){f=1;break;} if(f) continue; for(int j=1;j<=m;j++) vis[i][j]=1; } for(int i=1;i<=m;i++) { bool f=0; for(int j=1;j<=n;j++) if(dat[j][i]=='S'){f=1;break;} if(f) continue; for(int j=1;j<=n;j++) vis[j][i]=1; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cnt+=vis[i][j]; printf("%d",cnt); return 0; }