有时候编码解码映射太麻烦,干脆多开几维数组得了。搜索的话可以考虑用记忆化。
#include<bits/stdc++.h>
using namespace std;
char pai[9][4];
int kase;
int vis[5][5][5][5][5][5][5][5][5];
double d[5][5][5][5][5][5][5][5][5];
double dp(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9)
{
double& ans=d[a1][a2][a3][a4][a5][a6][a7][a8][a9];
if(vis[a1][a2][a3][a4][a5][a6][a7][a8][a9]==kase) return ans;
if(!a1&&!a2&&!a3&&!a4&&!a5&&!a6&&!a7&&!a8) return ans=1;
vis[a1][a2][a3][a4][a5][a6][a7][a8][a9]=kase;
int t[9]={a1,a2,a3,a4,a5,a6,a7,a8,a9};
ans=0;
int cnt=0;
for(int i=0;i<9;i++)
for(int j=0;j<i;j++)
if(t[i]&&t[j]&&pai[i][t[i]-1]==pai[j][t[j]-1])
{
cnt++;
t[i]--;
t[j]--;
ans+=dp(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t[i]++;
t[j]++;
}
if(cnt) ans/=cnt;
return ans;
}
int main()
{
while(scanf("%c",&pai[0][0])!=EOF)
{
for(int i=1;i<=3;i++)
for(int j=0;j<3;j++)
pai[0][i]=getchar();
for(int i=1;i<9;i++)
for(int j=0;j<4;j++)
for(int k=0;k<3;k++)
pai[i][j]=getchar();
getchar();getchar();
kase++;
printf("%.6lf\n",dp(4,4,4,4,4,4,4,4,4));
}
return 0;
}