社区讨论
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 条回复,欢迎继续交流。
正在加载回复...