UVA 1637 Double Patience

参考刘汝佳的代码如下:

#include<bits/stdc++.h>
using namespace std;
map<vector<int>,double>d;
char card[9][4][3];
double dp(vector<int>&cnt,int c){
    if(c==0)return 1;
    if(d.count(cnt)!=0)return d[cnt];
    double sum=0;
    int tot=0;
    for(int i=0;i<9;i++)if(cnt[i]>0)
        for(int j=i+1;j<9;j++)if(cnt[j]>0)
    if(card[i][cnt[i]-1][0]==card[j][cnt[j]-1][0]){
        tot++;
        cnt[i]--;cnt[j]--;
        sum+=dp(cnt,c-2);
        cnt[i]++;cnt[j]++;
    }
    if(tot==0)return d[cnt]=0;
    else return d[cnt]=sum/tot;
}
bool read_input(){
    for(int i=0;i<9;i++)
        for(int j=0;j<4;j++)
        if(scanf("%s",card[i][j])!=1)return false;
    return true;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    while(read_input()){
        vector<int>cnt(9,4);
        d.clear();
        printf("%.6f\n",dp(cnt,36));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/linruier2017/article/details/82017851
今日推荐