NYOJ 43 24 Point game

24 Point game

時間限制:3000 ms  |  內存限制:65535 KB
難度:5
描述

There is a game which is called 24 Point game.

In this game , you will be given some numbers. Your task is to find an expression which have all the given numbers and the value of the expression should be 24 .The expression mustn't have any other operator except plus,minus,multiply,divide and the brackets. 

e.g. If the numbers you are given is "3 3 8 8", you can give "8/(3-8/3)" as an answer. All the numbers should be used and the bracktes can be nested. 

Your task in this problem is only to judge whether the given numbers can be used to find a expression whose value is the given number。

輸入
The input has multicases and each case contains one line
The first line of the input is an non-negative integer C(C<=100),which indicates the number of the cases.
Each line has some integers,the first integer M(0<=M<=5) is the total number of the given numbers to consist the expression,the second integers N(0<=N<=100) is the number which the value of the expression should be.
Then,the followed M integer is the given numbers. All the given numbers is non-negative and less than 100
輸出
For each test-cases,output "Yes" if there is an expression which fit all the demands,otherwise output "No" instead.
樣例輸入
2
4 24 3 3 8 8
3 24 8 3 3
樣例輸出
Yes
No
來源
經典改編
上傳者

張雲聰



題意很簡單,C組數據,每組數據有一個M,一個N。M代表有M個數,你可以對這M個數任選兩個進行加減乘除,最後得到一個結果。如果結果能得到N,輸出Yes,否則No。


因爲數據比較小直接暴力dfs即可。(PS:只會這一個方法),先從M個數中任選一個(每個數都選一次),標記爲s,然後從剩下的數中逐個枚舉,分別進行加減乘除。比較最終結果即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define mv(a,b) memset(a,b,sizeof(a))
using namespace std;


int n;
int ans;
double a[10];
bool flag;
bool vis[10];
void dfs(double s,int cnt)
{
    if(cnt==n)                   //n個數,代表只能進行n次操作
    {
        if(fabs(s-ans)<0.0000001)  //運算過程中可能會有小數出現,所以需要處理精度的問題
        {
            flag=true;
            return ;
        }
    }
    for(int i=1; i<=n; i++)
    {
        if(!vis[i])
        {
            vis[i]=true;          //標記,避免重複
            cnt++;
            dfs(s+a[i],cnt);       // 加減乘除
            dfs(s-a[i],cnt);
            dfs(s*a[i],cnt);
            dfs(s/a[i],cnt);
            dfs(a[i]/s,cnt);
            dfs(a[i]-s,cnt);
            vis[i]=false;        // 回溯
            cnt--;
        }
    }
}


int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&ans);
        for(int i=1; i<=n; i++)
        {
            scanf("%lf",&a[i]);
        }
        flag=false;             // 標記是否找到
        for(int i=1; i<=n; i++)
        {
            if(flag)
                break;
            else
            {
                mv(vis,false);
                vis[i]=true;
                dfs(a[i],1);
            }
        }
        if(flag)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
}


發佈了35 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章