Parencedence!

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1947

题意:

给出一个表达式 然后两个人轮流对表达式进行操作 每一次操作就加一个括号将一个运算符和两边的数括起来运算 变成一个数(运算结果)

第一个人希望最后结果越大越好  第二个人希望结果越小越好 两人轮流来

第一次 第一个人先开始 得到的结果为 r1

第二次 第二个人先开始 得到的结果为 r2

如果 r1>(-r2) 第一个人胜利

如果 r2<(-r2)第二个人胜利

否则平局

思路:

dfs 搜索所有解空间 当该第一个人操作时 枚举括号加在哪里 取最大的结果

该第二个人时 枚举括号加在哪里 取最小的结果 直到最后只有一个数(最后结果)

考查:

本题考查对dfs的理解和有关博弈的概念

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<map>

#include<vector>

#include<stack>

#include<set>

#include<map>

#include<queue>

#include<algorithm>

#include<cmath>

#define LL long long

//#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const int INF=0x3f3f3f3f;

//const int MOD=1000000009;

const int N=35;

int r1[N],r2[N];

int a[N];

char c[N];

vector<int>vta;

vector<char>vtc;

int dfs(int x,int k)

{

    int tmp=0;

    int x1=vta[x],x2=vta[x+1];

    char c1=vtc[x];

    if(c1=='+')

    tmp=x1+x2;

    if(c1=='-')

    tmp=x1-x2;

    if(c1=='*')

    tmp=x1*x2;

    if(vtc.size()==1)

    return tmp;

    vta.erase(vta.begin()+x);

    vta[x]=tmp;

    vtc.erase(vtc.begin()+x);

    int m=-1;

    for(unsigned int i=0;i<vtc.size();++i)

    {

        if(m==-1)

        m=dfs(i,k^1);

        else

        {

            if(k==0)

            m=max(m,dfs(i,k^1));//cout<<"max"<<endl;}

            else

            m=min(m,dfs(i,k^1));//cout<<"min"<<endl;}

        }

    }

    vta[x]=x2;

    vta.insert(vta.begin()+x,x1);

    vtc.insert(vtc.begin()+x,c1);

    return m;

}

int main()

{

    //freopen("data.in","r",stdin);

    int T;

    cin>>T;

    for(int ca=1;ca<=T;++ca)

    {

       printf("Case %d:\n",ca);

       int n;

       cin>>n;

       vta.clear();

       vtc.clear();

       for(int i=0;i<=n;++i)

       {

           if(i>0)

           {cin>>c[i-1];vtc.push_back(c[i-1]);}

           cin>>a[i];vta.push_back(a[i]);

       }

       int l1=-1;

       for(int i=0;i<n;++i)

       {

           r1[i]=dfs(i,1);

           //cout<<i<<" "<<r1[i]<<endl;

           if(l1==-1||r1[l1]<r1[i])

           l1=i;

       }

       int l2=-1;

       for(int i=0;i<n;++i)

       {

           r2[i]=dfs(i,0);

           //cout<<i<<" "<<r2[i]<<endl;

           if(l2==-1||r2[l2]>r2[i])

           l2=i;

       }

       printf("Player 1 (%d%c%d) leads to %d\n",a[l1],c[l1],a[l1+1],r1[l1]);

       printf("Player 2 (%d%c%d) leads to %d\n",a[l2],c[l2],a[l2+1],r2[l2]);

       if(r1[l1]>(-r2[l2]))

       printf("Player 1 wins\n");

       else if(r1[l1]<(-r2[l2]))

       printf("Player 2 wins\n");

       else

       printf("Tie\n");

    }

    return 0;

}

  

你可能感兴趣的:(c)