社区讨论

99孩子

P2482[SDOI2010] 猪国杀参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@ludwlv8k
此快照首次捕获于
2024/03/30 17:42
2 年前
此快照最后确认于
2024/03/30 17:42
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
struct Card
{
    string card;
    bool usd;
};
deque<Card> Card_Heap;
int Cnt_FP, Cnt_ZP, Cnt_MP;
bool die[20];
namespace PigKill
{

    const string MP = "MP";
    const string FP = "FP";
    const string ZP = "ZP";
    const string J = "J";
    const string P = "P";
    const string K = "K";
    const string F = "F";
    const string N = "N";
    const string W = "W";
    const string D = "D";
    const string Z = "Z";
    struct Charactor;
    vector<Charactor> Char;
    struct Charactor
    {
        short blood = 4;
        int id;
        string name;
        bool Bow = 0;
        bool Jumped = 0;
        bool If_bad = 0;
        bool Waste = 0;
        bool UsdKill = 0;
        vector<Card> card;

        auto Get_Iterator()
        {
            for (auto it = Char.begin(); it != Char.end(); ++it)
                if (it->id == id)
                    return it;
            return Char.end();
        }

        void Drop_Anything()
        {
            if (card.size())
                card.clear();
            Bow = 0;
            return;
        }

        bool Use_Peach()
        {
            bool GetPeach = 0;
            for (auto it = card.begin(); it != card.end(); ++it)
                if (it->card == P && it->usd == 0)
                {
                    GetPeach = 1;
                    it->usd = 1;
                    break;
                }
            if (GetPeach == 0)
                return false;
            if (blood < 4)
            {
                ++blood;
                return true;
            }
            return false;
        }
        void GetHurt()
        {
            --blood;
            if (blood <= 0)
                if (!Use_Peach())
                    Waste = 1;
        }
        auto find(string s)
        {
            for (auto it = card.begin(); it != card.end(); ++it)
                if (it->card == s && it->usd == 0)
                    return it;
            return card.end();
        }
        auto Get_Position()
        {
            for (auto it = Char.begin(); it != Char.end(); ++it)
                if (it->id == id)
                    return it;
        }
        auto Find_Target()
        {
            auto p = Get_Position();
            if (name == MP)
            {
                for (auto it = (p + 1); it != Char.end(); ++it)
                    if (it->If_bad || (it->Jumped && it->name == FP))
                        return it;
                return Char.end();
            }

            if (name == ZP)
            {
                for (auto it = (p + 1); it != Char.end(); ++it)
                    if (it->name == FP && it->Jumped == 1)
                        return it;
                for (auto it = Char.begin(); it != p; ++it)
                    if (it->name == FP && it->Jumped == 1)
                        return it;
                return Char.end();
            }

            if (name == FP)
            {
                for (auto it = (p + 1); it != Char.end(); ++it)
                    if (it->name != FP && it->Jumped == 1)
                        return it;
                return Char.begin();
            }
        }
        void Jump_Out() { Jumped = 1; }
        bool Judge_de_J(auto to)
        {
            for (auto it = to; it != Char.end(); ++it)
            {
                if (name != FP && it->name == ZP)
                    continue;
                if (name == FP && it->name == FP)
                    continue;
                if (name == ZP && it->name != FP)
                    continue;
                auto i = it->find(J);
                if (i != it->card.end())
                {
                    i->usd = 1;
                    it->Jump_Out();
                    return !it->Judge_J(it);
                }
            }
            for (auto it = Char.begin(); it != to; ++it)
            {
                if (name != FP && it->name == ZP)
                    continue;
                if (name == FP && it->name == FP)
                    continue;
                if (name == ZP && it->name != FP)
                    continue;
                auto i = it->find(J);
                if (i != it->card.end())
                {
                    i->usd = 1;
                    it->Jump_Out();
                    return !it->Judge_J(it);
                }
            }
            return false;
        }

        bool Judge_J(auto who)
        {
            if (Jumped == 0)
                return false;
            for (auto it = who; it != Char.end(); ++it)
            {
                if (name == FP && it->name != FP)
                    continue;
                else if (name != FP && it->name == FP)
                    continue;
                auto i = it->find(J);
                if (i != it->card.end())
                {
                    i->usd = 1;
                    it->Jump_Out();
                    return !it->Judge_de_J(Get_Iterator());
                }
            }
            for (auto it = Char.begin(); it != who; ++it)
            {
                if (name == FP && it->name != FP)
                    continue;
                else if (name != FP && it->name == FP)
                    continue;
                auto i = it->find(J);
                if (i != it->card.end())
                {
                    i->usd = 1;
                    it->Jump_Out();
                    return !it->Judge_de_J(Get_Iterator());
                }
            }
            return false;
        }
        void Fight_With(auto p)
        {
            Jump_Out();
            If_bad = false;

            if (p->Judge_J(Get_Iterator()))
                return;
            if (name == MP && p->name == ZP)
            {
                p->GetHurt();
                return;
            }
            bool who; // 0是用F的,1是被用的那个
            while (true)
            {
                auto it = p->find(K);
                if (it == p->card.end())
                {
                    who = true;
                    break;
                }
                else
                    it->usd = 1;
                it = find(K);
                if (it == card.end())
                    break;
                else //
                    it->usd = 1;
            }
            if (who == false)
                GetHurt();
            else
                p->GetHurt();
        }
        void Man_To_Man() // 男♂男♂入♂侵♂
        {
            for (auto it = Char.begin(); it != Char.end(); ++it)
            {
                if (it->id == id)
                    continue;
                if (it->Judge_J(Get_Iterator()))
                    continue;
                auto i = it->find(K);
                if (i == it->card.end())
                {
                    it->GetHurt();
                    if (it->name == MP && Jumped == 0)
                    {
                        If_bad = true;
                    }
                }
                else
                    i->usd;
            }
        }
        void Rains_Of_Arrows()
        {
            for (auto it = Char.begin(); it != Char.end(); ++it)
            {
                if (it->id == id)
                    continue;
                if (it->Judge_J(Get_Iterator()))
                    continue;
                auto i = it->find(D);
                if (it->card.end() == i)
                {
                    it->GetHurt();
                    if (it->name == MP && Jumped == 0)
                        If_bad = true;
                }
                else
                    i->usd;
            }
        }
        void Get_A_Kill()
        {
            int time = 3;
            while (time--)
            {
                if (Card_Heap.size() > 1)
                {
                    card.push_back(Card_Heap.front());
                    Card_Heap.pop_front();
                }
                else
                    card.push_back(Card_Heap.front());
            }
        }
        bool Use(string s)
        {
            if (s == J)
                return false;
            if (s == K)
            {
                if (UsdKill && Bow == 0)
                    return false;
                auto it = Find_Target();
                if (it == Char.end())
                    return false;
                auto i = it->find(D);
                if (i == it->card.end())
                    it->GetHurt();
                else
                    i->usd = 1;
                return UsdKill = true;
            }
            if (s == P)
            {
                return Use_Peach();
            }
            if (s == F)
            {
                auto it = Find_Target();
                if (it == Char.end())
                    return false;
                Fight_With(it);
                return true;
            }
            if (s == N)
            {
                Man_To_Man();
                return true;
            }
            if (s == W)
            {
                Rains_Of_Arrows();
                return true;
            }
            if (s == Z)
            {
                return Bow = true;
            }
            return false;
        }
        void Round_Begin()
        {
            int time = 2;
            while (time--)
            {
                card.push_back(Card_Heap.front());
                if (Card_Heap.size() > 1)
                    Card_Heap.pop_front();
            }
        }
        void Check_Death()
        {
            for (auto it = Char.begin(); it != Char.end();)
            {
                if (it->id == id)
                {
                    ++it;
                    continue;
                }
                if (it->Waste == 1)
                {
                    if (it->name == MP)
                        --Cnt_MP;
                    if (it->name == ZP)
                        --Cnt_ZP;
                    if (it->name == FP)
                        --Cnt_FP;
                    die[it->id] = true;
                    if (it->name == FP)
                        Get_A_Kill();
                    if (it->name == ZP && name == MP)
                        Drop_Anything();
                    it = Char.erase(it);
                }
                else
                    ++it;
            }
        }
        void This_is_My_Round()
        {
            Round_Begin();
            bool usd = 1;
            while (card.size() > 0 && usd && !Waste)
            {
                usd = 0;

                auto i = card.begin();
                while (!usd && i != card.end())
                {

                    if (i->usd == 1)
                    {
                        ++i;
                        continue;
                    }
                    if (Use(i->card))
                    {
                        i->usd = 1;
                        usd = 1;
                        break;
                    }
                    ++i;
                }
                if (usd == 0)
                    return;
                Check_Death();
                if (Cnt_FP == 0 || Cnt_MP == 0)
                    return;
            }
        }
    };
}
using namespace PigKill;
int n, m;

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i)
    {
        Charactor New;
        cin >> New.name;
        int time = 4;
        while (time--)
        {
            string s;
            cin >> s;
            New.card.push_back({s, 0});
        }
        if (New.name == MP)
            ++Cnt_MP;
        if (New.name == ZP)
            ++Cnt_ZP;
        if (New.name == FP)
            ++Cnt_FP;
        New.id = i;
        Char.push_back(New);
    }
    Char[0].Jump_Out();
    for (int i = 1; i <= m; ++i)
    {
        string s;
        cin >> s;
        Card_Heap.push_back({s, 0});
    }
    while (Cnt_MP && Cnt_FP)
    {
        for (auto it = Char.begin(); it != Char.end();)
        {
            if (!Cnt_MP || !Cnt_FP)
                break;
            it->This_is_My_Round();
            it->UsdKill = 0;
            if (it->Waste)
            {
                if (it->name == MP)
                    --Cnt_MP;
                if (it->name == ZP)
                    --Cnt_ZP;
                if (it->name == FP)
                    --Cnt_FP;
                it = Char.erase(it);
                continue;
            }
            else
                ++it;
        }
    }
    if (Cnt_MP == 0)
        printf("FP\n");
    else
        printf("MP\n");
    int id = 1;
    auto it = Char.begin();
    while (id != n + 1)
    {
        if (die[id])
            printf("DEAD\n");
        else
        {
            for (auto S : it->card)
                if (S.usd == 0)
                    cout << (S.card) << " ";
            printf("\n");
            ++it;
        }
        ++id;
    }
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...