题意及官方题解:
思路:
分析题意可以发现计数只需要维护2*2的矩阵满足题目要求即可
将奇数格的颜色翻转发现矩阵只会有三种形式:
1、每一行颜色相同
2、每一列颜色相同
3、全部的颜色相同
然后容斥一下即可
代码:
#include<bits/stdc++.h>
const int mod = 998244353;
const int N = 1e3+5;
using namespace std;
char str[N];
int r[N],c[N];
int qpow2(int y){
int res = 1 , x = 2;
while(y){
if(y&1)res = 1LL * res * x % mod;
y>>=1;x = 1LL * x * x % mod;
}return res;
}
int main(){
int T;scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
int numr = n ,numc = m , rc = -1;
bool okr = 1 , okc = 1 ,ok = 1;
memset(r,-1,sizeof(r));
memset(c,-1,sizeof(c));
for(int i=1;i<=n;i++){
scanf("%s",str+1);
for(int j=1,rr=1;j<=m;j++)if(str[j]!='?'){
numr-=rr;numc--;rr=0;
int k = (str[j]=='R');
if((i^j)&1)k^=1;
if(r[i]==-1)r[i]=k;
else if(r[i]!=k)okr=false;
if(c[j]==-1)c[j]=k;
else if(c[j]!=k)okc=false;
if(rc==-1)rc=k;
else if(rc!=k)ok=false;
}
}int ans = 0;
if(okr)ans += qpow2(numr);
if(okc)ans += qpow2(numc);
if(ok)ans -= 1+(rc==-1);
if(ans>=mod)ans-=mod;
else if(ans<0)ans+=mod;
printf("%d\n",ans);
}return 0;
}