12808:那些年我们画格子

hrc122449 2024-08-23 10:21:35
#include<cstdio>
const int N=105,P=1000000007;
int n,m,K,S,o,i,j,k,x,y,t,A,B,f[2][N*N][5],g[2][N*N][4][4],w[4][4],ans;char a[N][N],b[N][N];
inline int getid(char x){
  if(x=='G')return 0;
  if(x=='B')return 1;
  if(x=='R')return 2;
  return 3;
}
inline void up(int&a,int b){a=a+b<P?a+b:a+b-P;}
void check(int S){
  b[1][1]=S&3;
  b[1][2]=S>>2&3;
  b[2][1]=S>>4&3;
  b[2][2]=S>>6;
  for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(i>2||j>2)b[i][j]=b[i&1?1:2][j&1?1:2];
  for(t=0,i=1;i<=n;i++)for(j=1;j<=m;j++)if(a[i][j]!=b[i][j])t++;
  if(t>K)return;
  for(i=1;i<=n;i++)for(j=1;j<=m;j++)
    for(x=-1;x<=1;x++)if(i+x>=1&&i+x<=n)for(y=-1;y<=1;y++)if((x||y)&&j+y>=1&&j+y<=m)
      if(b[i][j]==b[i+x][j+y])return;
  ans++;
}
inline void getw(int x,int m){
  for(int A=0;A<4;A++)for(int B=0;B<4;B++){
    w[A][B]=0;
    for(int i=1;i<=m;i++){
      int j=i&1?A:B;
      if(j!=b[x][i])w[A][B]++;
    }
  }
}
void solve(int n,int m){
  getw(1,m);
  for(j=0;j<=K;j++)for(x=0;x<4;x++)for(y=0;y<4;y++)g[0][j][x][y]=0;
  for(o=x=0;x<4;x++)for(y=0;y<4;y++)if(w[x][y]<=K&&x!=y)g[0][w[x][y]][x][y]=1;
  for(i=2;i<=n;i++){
    getw(i,m);
    for(j=0;j<=K;j++)for(x=0;x<4;x++)for(y=0;y<4;y++)g[o^1][j][x][y]=0;
    for(j=0;j<=K;j++)for(x=0;x<4;x++)for(y=0;y<4;y++)if(g[o][j][x][y])
      for(k=0;k<4;k++)if(k!=x&&k!=y){
        t=6-x-y-k;
        if(j+w[k][t]<=K){
          up(g[o^1][j+w[k][t]][k][t],g[o][j][x][y]);
        }
      }
    o^=1;
  }
  for(j=0;j<=K;j++)for(x=0;x<4;x++)for(y=0;y<4;y++)up(ans,g[o][j][x][y]);
}
int main(){
  scanf("%d%d%d",&n,&m,&K);
  for(i=1;i<=n;i++){
    scanf("%s",a[i]+1);
    for(j=1;j<=m;j++)a[i][j]=getid(a[i][j]);
  }
  if(n==1||m==1){
    for(f[0][0][4]=i=1;i<=n;i++)for(j=1;j<=m;j++){
      for(k=0;k<=K;k++)for(x=0;x<5;x++)f[o^1][k][x]=0;
      for(k=0;k<=K;k++)for(x=0;x<5;x++)if(f[o][k][x])for(y=0;y<4;y++)if(y!=x)up(f[o^1][k+(y!=a[i][j])][y],f[o][k][x]);
      o^=1;
    }
    for(i=0;i<=K;i++)for(j=0;j<4;j++)up(ans,f[o][i][j]);
  }else{
    for(S=0;S<1<<8;S++)check(S);
    ans=(P-ans)%P;
    for(i=1;i<=n;i++)for(j=1;j<=m;j++)b[i][j]=a[i][j];
    solve(n,m);
    for(i=1;i<=n;i++)for(j=1;j<=m;j++)b[j][i]=a[i][j];
    solve(m,n);
  }
  return printf("%d",ans),0;
}

 

...全文
211 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

18,511

社区成员

发帖
与我相关
我的任务
社区描述
欢迎所有爱好c++的人加入
经验分享c++青少年编程 技术论坛(原bbs) 湖北省·武汉市
社区管理员
  • 一只贴代码君
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

社区意在提高大家C++编程水平,共同进步,无硬性规则,大家可以自由活动,尽情发言,想要管理员和名誉头衔可以与主管理员协商,也欢迎大家提出建议

试试用AI创作助手写篇文章吧