Description
一个
n∗m
的棋盘,上面有三种棋子
B
,
Input
第一行一整数
T
表示用例组数,每组用例首先输入两个整数
Output
输出方案数,结果模 998244353
Sample Input
2
2 2
RB
??
3 3
???
?R?
???
Sample Output
2
7
Solution
问题转化为对于任意一个
2∗2
的子矩阵有两个
B
和两个
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define maxn 1005
#define mod 998244353
int T,n,m,row[maxn],col[maxn],nr,nc,flag;
char s[maxn];
void inc(int &a,int b)
{
a=a+b>=mod?a+b-mod:a+b;
}
void dec(int &a,int b)
{
a=a-b<0?a-b+mod:a-b;
}
int mod_pow(int a,int b)
{
int ans=1;
while(b)
{
if(b&1)ans=(ll)ans*a%mod;
a=(ll)a*a%mod;
b>>=1;
}
return ans;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
nr=n,nc=m,flag=0;
for(int i=1;i<=n;i++)row[i]=0;
for(int i=1;i<=m;i++)col[i]=0;
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=m;j++)
if(s[j]!='?'&&!(nr==-1&&nc==-1))
{
int type;
if(s[j]=='R')type=1;
else type=2;
if((i+j)&1)type=3-type;
if(row[i]==3-type)nr=-1;
else if(!row[i])nr--,row[i]=type;
if(col[j]==3-type)nc=-1;
else if(!col[j])nc--,col[j]=type;
if(flag!=-1)
if(flag==3-type)flag=-1;
else flag=type;
}
}
int ans=0;
if(nr>=0)inc(ans,mod_pow(2,nr));
if(nc>=0)inc(ans,mod_pow(2,nc));
if(flag!=-1)
{
if(flag==0)dec(ans,2);
else dec(ans,1);
}
printf("%I64d\n",ans);
}
return 0;
}