hihocoder #1115 : 諾茲多姆(dfs爆搜)

時間限制:1000ms

單點時限:1000ms

內存限制:256MB

描述

wuzhengkai是一個爐石傳說玩家。

有一天,他碰到對面上了個諾茲多姆並上了嘲諷和聖盾。

諾茲多姆是一個有8點攻擊力和8點生命值的隨從,這意味着他能夠承受總量小於8點的傷害而不死亡,且對於任何攻擊他的單位造成8點傷害。

嘲諷意味着當諾茲多姆死亡之前你不能攻擊對方玩家。聖盾意味着諾茲多姆受到的第一次傷害爲0,然後諾茲多姆失去聖盾。

諾茲多姆的能力是讓回合時間變爲15s,這導致wuzhengkai來不及計算了。

wuzhengkai場上有一些隨從,每個隨從有其攻擊力和生命值,含義同上。

同時一些隨從也具有聖盾。一些隨從還具有風怒,使得他若在第一次攻擊後存活,則還能夠攻擊一次。

他想讓你幫忙算出這回合他能帶給對方玩家多少傷害。

輸入

輸入包含多組數據。

第一行一個整數n,(0<=n<=7),表示wuzhengkai場上有n個隨從。

接下來n行,每行首先兩個整數Att和Hp(0<Att<=10,0<Hp<=10),表示該隨從的攻擊力和生命值

接下來每行可能還有0~2個字母跟在這兩個整數之後。字母D表示聖盾,字母W表示風怒。

每行中的內容以一個空格隔開。

輸出

對於每組數據,輸出一個整數,表示wuzhengkai能對對方玩家造成的最大傷害。

樣例輸入

3
1 1 D W
8 8
4 2 D

樣例輸出

5

玩過爐石的好理解一點……

/*

*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <bitset>
#include <stack>
#define ll long long
#define ull unsigned long long
#define inf 0x3f3f3f3f
const int mod=997;
const int N=110;
using namespace std;
int num[10];
int n,sum;
struct node
{
    int att,hp;
    bool W,D;
} s[10];
void dfs(int nom,int face,int k,bool D)//諾姆生命值,玩家收到傷害,第幾個隨從,諾姆是否有聖盾
{
    if(k>n)
    {
        if(nom>=8)
            sum=max(sum,face);
        return;
    }
    int i=num[k];
    if(D)//諾姆有聖盾
    {
        if(s[i].W)//隨從有風怒
        {
            if(s[i].D||s[i].hp>8)//保證可以攻擊兩次(有聖盾和血量大於諾姆 的攻擊值)
            {//該隨從第一次攻擊諾姆聖盾,第二次留着打臉
                dfs(nom,face+s[i].att,k+1,false);
                dfs(nom+s[i].att,face,k+1,false);
             //該隨從第一次攻擊諾姆聖盾,第二次攻擊諾姆
            }
        }
        dfs(nom,face,k+1,false);//攻擊聖盾
    }
    else//諾姆無聖盾
    {
        if(s[i].W)//隨從有風怒
        {
            dfs(nom,face+s[i].att*2,k+1,false);//可以直接打臉
            if(s[i].D||s[i].hp>8)//保證可以攻擊兩次(有聖盾和血量大於諾姆 的攻擊值)
            {
                dfs(nom+s[i].att,face+s[i].att,k+1,false);//一次打諾姆,打死諾姆後,第二次打臉
                dfs(nom+s[i].att*2,face,k+1,false);//兩次都打諾姆,不保證打死
            }
        }
        dfs(nom+s[i].att,face,k+1,false);//打諾姆,不保證打死
        dfs(nom,face+s[i].att,k+1,false);//打臉
    }
}
int main()
{

    while(~scanf("%d",&n))
    {
        sum=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d",&s[i].att,&s[i].hp);
            s[i].D=false;
            s[i].W=false;
            char ch;
            while(~scanf("%c",&ch))
            {
                if(ch=='\n')
                    break;
                else if(ch=='D')
                    s[i].D=true;
                else if(ch=='W')
                    s[i].W=true;
            }
        }
        for(int i=1; i<=n; i++)
        {
            num[i]=i;
        }
        for(int i=1; i<=n; i++)
        {
            swap(num[i],num[1]);
            dfs(0,0,1,true);
        }
        printf("%d\n",sum);
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章