24点

24点是一种老少咸宜的游戏,它的具体玩法如下:

给玩家4张牌,每张牌的面值在1~13之间,允许其中有数值相同的牌。采用加、减、乘、除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能使用一次,尝试构造一个表达式,使其运算结果为24。

请你根据上述游戏规则构造一个24点游戏的算法,要求如下:

输入:n1,n2,n3,n4

输出:若能得到运算结果为24,则输出一个对应的运算表达式;若不能,则输出“No answer”

输入样例:11,8,3,5

输出样例:(11-8)*(3+5)=24

输入样例:3,8,8,10

输出样例:(8*10-8)/3=24

输入样例:1,1,1,1

输出样例:No answer

 

把所有可能的组合方式列出来

#include<iostream>
#include<cstdlib>
using namespace std;

int F(int a,int ch,int b)
{
    switch(ch)
    {
        case 0:return a+b;
        case 1:return a-b;
        case 2:return a*b;
        case 3:if(b!=0&&(a%b==0)) return a/b;else return -100;
    }
}

char p(int i)
{
    switch(i)
    {
        case 0:return '+';
        case 1:return '-';
        case 2:return '*';
        case 3:return '/';
    }
}

void is24(int *a){
    int i,j,k;
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
            for(k=0;k<4;k++)
            {
                if(F(F(F(a[0],i,a[1]),j,a[2]),k,a[3])==24)
                {
                cout<<'('<<'('<<a[0]<<p(i)<<a[1]<<')'<<p(j)<<a[2]<<')'<<p(k)<<a[3]<<endl;
                exit(0);
                }
                if(F(F(a[0],i,F(a[1],j,a[2])),k,a[3])==24)
                {
                cout<<'('<<a[0]<<p(i)<<'('<<a[1]<<p(j)<<a[2]<<')'<<')'<<p(k)<<a[3]<<endl;
                exit(0);
                }
                if(F(F(a[0],i,a[1]),j,F(a[2],k,a[3]))==24)
                {
                    cout<<i<<j<<k<<endl;
                cout<<'('<<a[0]<<p(i)<<a[1]<<')'<<p(j)<<'('<<a[2]<<p(k)<<a[3]<<')'<<endl;
                exit(0);
                }
                if(F(a[0],i,F(F(a[1],j,a[2]),k,a[3]))==24)
                {
                cout<<a[0]<<p(i)<<'('<<'('<<a[1]<<p(j)<<a[2]<<')'<<p(k)<<a[3]<<')'<<endl;
                exit(0);
                }
            }
    return;
}

void go(int *a,const int n){
    int i;
    if(n>3)
    {
        is24(a);
        return;
    }
    for(i=n;i<4;i++)
    {
        swap(a[n],a[i]);
        go(a,n+1);
        swap(a[n],a[i]);
    } 
}

int main()
{
    int a[4];
    char ch;
    cin>>a[0]>>ch>>a[1]>>ch>>a[2]>>ch>>a[3];//格式为 1,2,3,4  用逗号隔开 
    go(a,0);
    cout<<"No answer"<<endl;
    return 0;
}

 

posted @ 2018-01-02 20:26  ohyear~  阅读(314)  评论(0编辑  收藏  举报