2018 徐州网络赛 C Cacti Lottery

5 篇文章 0 订阅

题意:有3*3的矩阵,你知道其中的一些点的值,这些值你的对手也知道,并且你的对手还知道几个你不知道的值。你的对手做出最好的决策,让你来猜一猜你的对手获得的得分。

思路:很明显是搜索,先是枚举你的对手知道的情况,再根据每种情况进行搜索,做出最优的抉择。

坑点: CLION的优化做的也太好了吧,忘写了return 居然在本地能跑。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef int lint;
lint reward[25];
void prework(){
    reward[6] = 10000;
    reward[7] = 36;
    reward[8]=720;
    reward[9] = 360;
    reward[10]=80;
    reward[11]=252;
    reward[12]=108;
    reward[13]=72;
    reward[14]=54;
    reward[15]=180;
    reward[16]=72;
    reward[17]=180;
    reward[18]=119;
    reward[19]=36;
    reward[20]=360;
    reward[21]=1080;
    reward[22]=144;
    reward[23]=1800;
    reward[24]=3600;
}
lint vis[10];
double ans;
lint solve_r1(  string& str  ){
    lint res = 0;
    lint c1 = str[0]+str[1]+str[2] - 3*'0';
    res  = max( res,reward[c1] );
    return res;
}
lint solve_r2(  string& str  ){
    lint res = 0;
    lint c2 = str[3]+str[4]+str[5] - 3*'0';
    res = max( res,reward[c2] );
    return res;
}
lint solve_r3(  string& str  ){
    lint res = 0;
    lint c3 = str[6]+str[7]+str[8] - 3*'0';
    res = max( res,reward[c3] );
    return res;
}
lint solve_c1(  string& str ){
    lint res = 0;
    lint c1 = str[0]+str[3]+str[6]-3*'0';
    res = max( res,reward[c1] );
    return res;
}
lint solve_c2(  string& str ){
    lint res = 0;
    lint c2 = str[1]+str[4]+str[7]-3*'0';
    res = max(res,reward[c2] );
    return res;
}
lint solve_c3(  string& str ){
    lint res = 0;
    lint c3 = str[2]+str[5]+str[8]-3*'0';
    res = max( res,reward[c3] );
    return res;
}
lint solve_d1(  string& str ){
    lint res = 0;
    lint c1 = str[0]+str[4]+str[8]-3*'0';
    res = max( res,reward[c1] );
    return res;
}
lint solve_d2(  string& str ) {
    lint res = 0;
    lint c2 = str[2] + str[4] + str[6] - 3 * '0';
    res = max(res, reward[c2]);
    return res;
}
double ansc1,ansc2 ,ansc3,ansr1,ansr2,ansr3,ansd1,ansd2,cnt3 = 0;
void dfs2(  string str,lint p ){
    if( p == 9 ){
        ansc1 += solve_c1( str ) ;ansc2 += solve_c2( str ) ;ansc3 += solve_c3( str ) ;
        ansr1 += solve_r1(str);ansr2 += solve_r2(str);ansr3 += solve_r3(str);
        ansd1 += solve_d1(str);ansd2 += solve_d2(str);
        cnt3++;
        return;
    }
    if( str[p] == '#' ){
        for( lint i = 1;i <= 9;i++ ){
            if( vis[i] ) continue;
            vis[i] = 1;
            str[p] = '0'+i;
            dfs2(str,p+1);
            vis[i] = 0;
        }
    }else{
        dfs2( str,p+1 );
    }
}
lint cnt4;
void dfs( string str,lint p ){
    if( p == 9 ){
        double ans2 = 0;
        cnt3 = 0;
        ansc1 = ansc2 = ansc3 = ansr1 = ansr2 = ansr3 = ansd1 = ansd2 = 0;
        dfs2( str,0 );
        ans2 = max( ans2,ansc1 );ans2 = max( ans2,ansc2 );ans2 = max( ans2,ansc3 );
        ans2 = max( ans2,ansr1 );ans2 = max( ans2,ansr2 );ans2 = max( ans2,ansr3 );
        ans2 = max( ans2,ansd1 ); ans2 = max( ans2,ansd2 );
        ans += ans2/cnt3;
        cnt4++;
        return;
    }
    if( str[p] == '*' ){
        for( lint i = 1;i <= 9;i++ ){
            if( vis[i] ) continue;
            vis[i] = 1;
            str[p] = '0'+i;
            dfs(str,p+1);
            vis[i] = 0;
        }
    }else{
        dfs( str,p+1 );
    }
}
int main(){
    prework();
    lint T;
    string str;
    scanf("%d",&T);
    while( T-- ){
        string str0;
        lint cnt = 0,cntdigit  = 0;
        for( lint i = 0;i < 3;i++ ){
            cin >> str;str0 += str;
        }
        cnt4 = 0;ans = 0;
        memset( vis,0,sizeof(vis));
        for( lint i = 0;i < str0.size();i++ ){
            if( isdigit( str0[i] ) ) {
                vis[str0[i]-'0'] = 1;
                cntdigit++;
            }
            if( str0[i] == '*' ) cnt++;
        }
        dfs(str0,0);
        printf("%.6f\n", (double)ans/cnt4 );
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值