简单的搜索枚举状态然后套用状态压缩的模板。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char per[6];
int dp[20001][100];
#define sc(x) scanf("%d",&x)
#define st(x) scanf("%s",x)
#define tr(x) temp[x].per
#define debug(x) printf("________________%d________________\n",x)
const int mod=1e6;
struct tri
{
char per[6];
} temp[244];
int r,c,k;
bool cheks() {
for(int i=1; i<c; i++)
if(per[i]==per[i-1])
return false;
return true;
}
int sign=0,wx=0;
void dfs(int n)
{
if(n==c) {
if(cheks())
strcpy(temp[++sign].per,per);
dp[1][sign]=1;
return ;
}
for(int i=0; i<3; i++)
{
per[n]=char(48+i);
dfs(n+1);
}
}
bool comp(int x,int y)
{
for(int i=0; i<c; i++)
if(tr(x)[i]==tr(y)[i])
return false;
return true;
}
int main()
{
sc(r);
sc(c);
sc(k);
dfs(0);
for(int i=0; i<c; i++)
{
cin >> tr(sign+1)[i];
tr(sign+1)[i]--;
}
tr(sign+1)[c]='\0';
per[c]='\0';
for(int i=1; i<=sign; i++) {
if(!strcmp(tr(sign+1),tr(i)))
{
wx=i;
}
}
if(k==1) {
for(int i=1; i<=sign; i++)
dp[1][i]=0;
dp[1][wx]=1;
}
for(int i=1; i<k; i++)
for(int j=1; j<=sign; j++)
for(int l=1; l<=sign; l++)
if(comp(j,l))
dp[i][l]=(dp[i][l]+dp[i-1][j])%mod;
for(int i=1; i<=sign; i++)
if(comp(wx,i)){
dp[k][wx]=(dp[k][wx]+dp[k-1][i])%mod;
}
for(int i=k+1; i<=r; i++)
for(int j=1; j<=sign; j++)
for(int l=1; l<=sign; l++)
if(comp(j,l))
dp[i][l]=(dp[i][l]+dp[i-1][j])%mod;
int tot=0;
for(int i=1; i<=sign; i++)
tot=(tot+dp[r][i])%mod;
printf("%d\n",tot);
};