社区讨论
关于Online Judge的问题
学术版参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m596fx85
- 此快照首次捕获于
- 2024/12/29 13:35 去年
- 此快照最后确认于
- 2025/11/04 12:12 4 个月前
这是我的猪国杀代码,以下样例在本地和洛谷在线IDE都是能正确跑过的(都是20多ms),但是交到题目里就TLE了,这是为什么
input:
CPP#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define debug false
using namespace std;
int n, m;
int MP;
queue<char> card;
char last_card;
void NZRQ(int i); // 南猪入侵
void WJQF(int i);
void attack(int i, bool &usekill);
void Fight(int i, int j);
void kill(int j, int i, char c, int khp = 1);
bool askuse(int id, int piguse, int iswuxie = 0); // 询问是否有猪需要出无懈可击
int nxtp(int i);
char getcard();
bool gameover();
bool DoFight(int id);
void out();
int getrev(int id);
// 0:未跳猪,1:忠猪,2:反猪,3:类反猪
class PLAYER
{
public:
int type; // 0:主猪 1:忠猪 2:反猪
int HP = 4;
int jump = 0; // 跳忠,跳反
int weapon = 0; // 装不装武器
int id;
vector<char> cards;
void erase(int i)
{
if (cards.size() < i + 1)
return;
cards.erase(cards.begin() + i);
}
bool dieask()
{
for (int i = 0; i < cards.size(); i++)
if (cards[i] == 'P')
{
erase(i);
return true;
}
return false;
}
bool ask(int idjump, int iswuxie = 0)
{
if (debug)
cout << "询问" << id << "号猪是否对跳方为" << idjump << "的猪使用无懈可击" << endl;
bool willuse = false;
bool isfriend = 1;
if (iswuxie == 1)
{ // 是无懈可击,即对自己人的无懈可击使用无懈可击没有好处
isfriend = 0;
if (debug)
cout << "为无懈可击" << endl;
willuse = true;
if (idjump == 1 && (this->type == 1 || this->type == 0))
willuse = false;
if (idjump == 2 && this->type == 2)
willuse = false;
if (!willuse)
{
if (debug)
cout << "选择不使用" << endl;
return false; // 不使用
}
}
else
{
if (idjump == 1 && (this->type == 1 || this->type == 0))
willuse = true;
if (idjump == 2 && this->type == 2)
willuse = true;
if (!willuse)
{
if (debug)
cout << "选择不使用" << endl;
return false; // 不使用
}
}
for (int i = 0; i < cards.size(); i++)
if (cards[i] == 'J')
{
// 使用了就代表跳了
if (isfriend)
this->jump = idjump;
else
this->jump = getrev(idjump);
erase(i);
if (debug)
cout << "选择使用\n";
return true; // 使用无懈可击
}
if (debug)
cout << "没有无懈可击" << endl;
return false; // 没有无懈可击
}
void Move()
{
// 摸牌阶段
for (int i = 1; i <= 2; i++)
cards.push_back(getcard());
if (debug)
out();
// 出牌阶段
bool usekill = false; // 使用过杀
int k;
bool result;
again:
for (int i = 0; i < cards.size(); i++)
{
switch (cards[i])
{
case 'P': // 桃
if (this->HP == 4)
break;
erase(i);
i--;
this->HP++;
break;
case 'Z': // 猪哥连弩
erase(i);
i--;
this->weapon = 1;
if (debug)
cout << id << " 获得 猪哥连弩" << endl;
goto again;
break;
case 'N': // 南猪入侵
erase(i);
i--;
NZRQ(id);
break;
case 'W': // 万箭齐发
erase(i);
i--;
WJQF(id);
break;
case 'K': // 杀
if (weapon == 1) // 装了猪哥连弩
usekill = false;
if (usekill) // 未装装备
break;
attack(id, usekill);
if (usekill)
{
erase(i);
goto again;
}
break;
case 'F': // 决斗
if (DoFight(id))
{
erase(i);
goto again;
}
break;
}
if (gameover())
break;
}
}
};
PLAYER pigs[30];
inline int nxtp(int i)
{
i = i % n + 1;
while (pigs[i].HP <= 0)
i = i % n + 1;
return i;
}
// 返回i的下一个猪的编号
inline int getrev(int id)
{
switch (id)
{
case 0:
return 0;
break;
case 1:
return 2;
break;
case 2:
return 1;
break;
case 3:
return 1;
break;
}
}
void out()
{
return;
cout << "手牌情况:\n";
for (int j = 1; j <= n; j++)
{
printf("%d ", pigs[j].cards.size());
for (int k = 0; k < pigs[j].cards.size(); k++)
printf("%c ", pigs[j].cards[k]);
cout << endl;
}
}
bool gameover()
{
if (pigs[MP].HP <= 0)
return true;
bool flag = true;
for (int i = 1; i <= n; i++)
if (pigs[i].HP > 0 && pigs[i].type == 2)
{
flag = false;
break;
}
if (flag) // 反猪全死,主公胜利
return true;
return false;
}
void prize(int i, int j)
{ // 奖励惩罚机制
// i kill j
if (pigs[j].type == 2)
{ // 反猪被杀
for (int k = 0; k < 3; k++)
pigs[j].cards.push_back(getcard());
}
if (pigs[j].type == 1 && pigs[i].type == 0)
{ // 主猪杀忠猪
if (debug)
cout << "主猪杀死了忠猪\n";
pigs[i].cards.clear();
}
}
char getcard()
{
if (card.empty())
{
if (debug)
cout << "牌堆空了\n";
return last_card;
}
char c = card.front();
card.pop();
if (debug)
cout << "发牌:" << c << endl;
return c;
}
bool askuse(int id, int piguse, int iswuxie) // 当前牌是不是无懈可击
{
if (pigs[id].jump == 0)
return false; // 没有人会对它使用无懈可击
if (pigs[piguse].HP > 0)
if (pigs[piguse].ask(pigs[id].jump, iswuxie))
return !askuse(piguse, piguse, !iswuxie);
for (int i = nxtp(piguse); i != piguse; i = nxtp(i)) // 循环询问
{
if (pigs[i].HP <= 0) // 此猪已死
continue;
if (pigs[i].ask(pigs[id].jump, iswuxie))
{ // 有人使用无懈可击
return !askuse(i, i, !iswuxie); // 重新询问有没有人对无懈可击使用无懈可击
}
}
return false; // 没有人使用无懈可击
}
bool DoFight(int id)
{
int k = nxtp(id);
for (int k = nxtp(id); k != id; k = nxtp(k))
{
if (pigs[k].HP <= 0) // 此猪已死
return false;
switch (pigs[id].type)
{
case 0: // 主猪
case 1:
if (pigs[k].jump == 2 || pigs[k].jump == 3)
{ // 反猪或类反猪
Fight(id, k);
return true;
}
break;
case 2: // 反猪
if (pigs[k].jump == 1)
{
if (debug)
cout << id << "对" << k << "发起了决斗\n";
Fight(id, k);
return true;
}
break;
}
}
return false;
}
int takeKill(int i)
{
// 从i的cards里取一个‘K’
int k = -1;
for (int j = 0; j < pigs[i].cards.size(); j++)
{
if (pigs[i].cards[j] == 'K')
{
k = j;
break;
}
}
if (k == -1)
return -1;
else
{
if (debug)
cout << i << "取走了" << k << endl;
pigs[i].erase(k);
return 1;
}
}
bool askshan(int id)
{
// 询问是否出闪(‘D’)
for (int i = 0; i < pigs[id].cards.size(); i++)
if (pigs[id].cards[i] == 'D')
{
pigs[id].erase(i);
return true;
}
return false;
}
void attack(int id, bool &usekill)
{
int k = nxtp(id);
if (pigs[k].HP <= 0) // 此猪已死
return;
switch (pigs[id].type)
{
case 0: // 主猪
case 1:
if (pigs[k].jump == 2 || pigs[k].jump == 3)
{ // 反猪或类反猪
if (!askshan(k))
kill(k, id, 'K', 1); // 不出闪
else
kill(k, id, 'K', 0);
usekill = true;
}
break;
case 2: // 反猪
if (pigs[k].jump == 1)
{
if (!askshan(k))
kill(k, id, 'K', 1); // 不出闪
else
kill(k, id, 'K', 0);
usekill = true;
}
break;
}
}
void Fight(int i, int j)
{
// 决斗
// j先出,i后出
if (pigs[i].type == 1 && j == MP)
{
pigs[i].HP--;
if (pigs[i].HP <= 0)
{
if (pigs[i].dieask())
pigs[i].HP++;
else
prize(j, i);
}
return;
}
if (pigs[j].type == 1 && i == MP)
{
pigs[j].HP--;
if (pigs[j].HP <= 0)
{
if (pigs[j].dieask())
pigs[j].HP++;
else
prize(i, j);
}
return;
}
kill(j, i, 'F', 0); // i对j表敌意,但是不扣血
if (askuse(j, i))
return; // 被无懈可击了
while (true)
{
if (takeKill(j) == -1) // j没牌了
{
pigs[j].HP--;
if (pigs[j].HP <= 0)
{
if (pigs[j].dieask())
pigs[j].HP++;
else
prize(i, j);
}
break;
}
if (debug)
cout << j << "出一张杀" << endl;
if (takeKill(i) == -1) // i没牌了
{
pigs[i].HP--;
if (pigs[i].HP <= 0)
{
if (pigs[i].dieask())
pigs[i].HP++;
else
prize(j, i);
}
break;
}
if (debug)
cout << i << "出一张杀" << endl;
}
}
void kill(int j, int i, char c, int khp)
{ // j被i扣血
if (debug)
{
cout << j << "被" << i << "攻击";
if (khp == 0)
cout << "(未造成伤害)";
cout << endl;
}
pigs[j].HP -= khp;
if (pigs[j].HP <= 0 && khp != 0)
{
if (pigs[j].dieask())
pigs[j].HP++;
else
prize(i, j); // 奖励机制
}
if (MP == pigs[j].id)
{ // 主猪
if (c == 'N' || c == 'W')
{
// 类反猪
if (pigs[j].jump != 2)
pigs[i].jump = 3;
}
else
{
// 反猪
pigs[i].jump = 2;
}
}
}
void NZRQ(int i)
{ // 南猪入侵
if (debug)
cout << i << "发动南猪入侵" << endl;
for (int j = nxtp(i); j != i; j = nxtp(j))
{
if (askuse(j, i, 0))
{
if (debug)
{
cout << "对" << j << "的南猪入侵被无懈可击了" << endl;
}
continue; // 被无懈可击了
}
if (takeKill(j) == -1)
kill(j, i, 'N');
}
}
void WJQF(int i)
{
if (debug)
cout << i << "发动万箭齐发" << endl;
for (int j = nxtp(i); j != i; j = nxtp(j))
{
if (askuse(j, i, 0))
{
if (debug)
{
cout << "对" << j << "的万箭齐发被无懈可击了" << endl;
}
continue; // 被无懈可击了
}
if (askshan(j) == false)
{
kill(j, i, 'W');
}
}
}
void input()
{
cin >> n >> m;
string s;
char c;
for (int i = 1; i <= n; i++)
{
cin >> s;
if (s == "MP")
{
MP = i;
pigs[i].jump = 1; // 忠方
pigs[i].type = 0;
}
else if (s == "ZP")
pigs[i].type = 1;
else
pigs[i].type = 2;
for (int j = 1; j <= 4; j++)
{
c = getchar();
while (c == ' ' || c == '\n')
c = getchar();
pigs[i].cards.push_back(c);
}
pigs[i].id = i;
}
for (int i = 1; i <= m; i++)
{
c = getchar();
while (c == ' ' || c == '\n')
c = getchar();
card.push(c);
if (debug)
cout << "加入牌堆" << c << endl;
last_card = c;
}
}
void outputdebug(int i, int type = 0)
{
if (type == 0)
{
cout << i << "号猪执行完毕,\n血量情况\n";
for (int j = 1; j <= n; j++)
cout << pigs[j].HP << " ";
cout << endl;
cout << "跳方情况:\n";
for (int j = 1; j <= n; j++)
cout << pigs[j].jump << " ";
cout << endl;
/*cout << "手牌情况:\n";
for (int j = 1; j <= n; j++)
{
printf("%d ", pigs[j].cards.size());
for (int k = 0; k < pigs[j].cards.size(); k++)
printf("%c ", pigs[j].cards[k]);
cout << endl;
}*/
cout << "牌堆情况:";
cout << card.size() << endl;
cout << "主猪血量:" << pigs[MP].HP << endl;
}
}
void Run()
{
int t = 0;
if (debug)
cout << "主猪:" << MP << endl;
while (pigs[MP].HP > 0) // 主公存活
{
if (debug)
cout << "第" << ++t << "回合" << endl;
bool firstmp = true;
for (int i = MP; i != MP || firstmp; i = nxtp(i), firstmp = false)
{
if (pigs[i].HP <= 0)
continue;
pigs[i].Move();
if (debug)
outputdebug(i);
// cout << "当前玩家:" << i << endl;
// cout << "手牌数:" << pigs[i].cards.size() << endl;
// for (int j = 0; j < pigs[i].cards.size(); j++)
// printf("%d ", pigs[i].cards[j]);
// cout << endl;
if (gameover())
return;
}
if (debug)
cout << "\n\n";
if (gameover())
break;
}
}
void output()
{
if (pigs[MP].HP > 0)
printf("MP\n");
else
printf("FP\n");
for (int i = 1; i <= n; i++)
{
if (pigs[i].HP <= 0)
{
printf("DEAD\n");
}
else
{
for (int j = 0; j < pigs[i].cards.size(); j++)
printf("%c ", pigs[i].cards[j]);
printf("\n");
}
}
}
int main()
{
// if (debug)
// freopen("15.in", "r", stdin);
// freopen("output.out", "w", stdout);
input();
Run();
output();
return 0;
}
样例:
5 2000
MP K K P P
FP D K D K
ZP P P D K
FP D K P D
FP P K P P
D D D P D K P P D D P D D K P P D P D P P K K P D P K D P P D Z P P P K P P D P K K Z K K P D K K P D Z K D P D P K P P K K D P P K P P P P K P K P D K K D P D K D P K Z K K K K D D K K Z P K D D P K P D K Z K P P P K D P K P K K P K Z D K Z K D P P K D P K K D D D D P K D K D K Z D K D P P Z D P K P P P K D D D D K P K K D D K D K P D P D D K D P K P P K P P D P K P K K K D P K D D P K K K K P K D Z K K P K P Z K D P P P P D P P Z P K K P D K K D D Z D K P P D P D Z P D P Z K K P K Z D D D D P P P K P D P D K K Z P K Z D K D D P K K D K K P D K P K K D P K P Z D P P P P P D P K K D Z K D P D K K P Z P P D D K K Z P D P P D P D P D P P D K P D P P Z K K D D D K K K Z P K P D P K K D P K D P D D K D D P K K P P K K P K D P K P K P D D D P D K D P Z D P K D D D K D D Z D P K D K K P D D K K D P P K D D K K K P P P D K P Z P P P P K P D D K D D K D K P K P P K Z K P D K P K D K K P Z K D P P K P K P P K K K D K P K P P K D K K Z K P P D D K K P D P D D P K K P D P P K P D K P P K K P D D P K P K P P K P P K K D D D D P K P P Z D K K D K P P P K K P P K D K D K P D Z D K P K P P P K D Z D Z P K K D K D K P P D P P P P D D K P D D D K P D D D K K K K D D D P P K P P K P D P P P D P P D D P P Z Z P K D K D K K K K P K K D D P K K K K K P D K K K P K Z P D K P P K P K D K P D K P K D K D P K K Z P K P Z D D P K D D D K D K D P D D K P D K Z P K P D K Z D K D D P D D D P D D P P P D K D K D P Z P D D D D P D D D D K K P D D P D K D D P P D D K K P K D P P D Z K P D K K D P K K Z P D D P K P D K Z D P P D P K P D P P Z P P P K D P D Z P K P P K D K D K Z K K D P P D D D K P D K D P K D D K K P P D P P P K D P K D P D P D Z D K D P D K D P P K D P K D K K K P Z K D P Z P K P P K D K K D K P D P P P D K P K P D P P D D P P Z P Z K P P D D P P P K P K Z P D D D K P P P D K P K D D K D P D K Z P D P D P D P K P P P K D D D P K P P P D K K D K K K Z K P K K K K P K K P Z D D P D P D D P P D D D D K K D K K P K K P K K P D D D P P K D D K K P K K Z D P D K K K D P P P K P K P P D P D D K P P K D K K K P P K K D P D P D D P D P P K P P K D K D P P D K K P P P P P P P D P K D D K D P K D P P P D D K K Z P Z K D P D P K P K D D D Z D P K K K K K P P D K D D P P P P K K P K K D D P D D D D K P P P K K D P D P K K D P P Z D P P D D K P Z K P P P P D K D P D Z K Z K Z D D K P D D P D P D K K P K K P D P D K P P D P P D K K D K P K D K P D D D D D P K P D D K D P P P K D Z K K P D K D P P D D P P D K K P P P P P D K P K D K K D P D D P P D Z D P K K K K P Z K P P Z D P P P K K D K K P D K P D P P K D K P D K K K K D P K K Z D D D P P D P Z K D P P D P K P P Z D K K P D K P P Z D D K K P D D P K K D P K K D Z D P Z D P K D P Z K P K D K P D D D D P P Z K D D D P P K D D K D P P K K Z K D D P K K D P K P D D P P K P P D D P P K P K P P K Z K Z P D P D P D P P D P K K P P P K K P K P K K K D P D P P D P K D P Z D P K K P P K K D P K P D K D K D D K D P K D P P K K D K K D P K P K Z D P D P P K D P K K K P P P K P D P P K D D D K D K K P P K Z D K K K P K K P K K D D K P K D K K P P K D P K D K P K K P K K D Z P P P D D P D D P P P P K D K P K K P K P K P K K K P K P D K K K K P Z D K P D P D K P K P P P P K D P D P Z K Z D K D D K P P P D P D D K K Z D Z Z P D K P D D P K P D D K P P D K Z P P Z D P D K K K D D D D P D K K P K K K P K P D P K P K D D K K P D P D P Z P P K P K D K D D P K P D K P D K D K D P K D P D P K K Z P P K D P D K D D K D K D K K K P Z P P P D Z D D K P Z P D K K P K D P D D D D D P P K D K K K P D P D P D P K K P K K K P D D K D D D P P K K K P K K P D P D K D K P Z K P K D K P K P K K D K D P D Z P Z P K D K D K D P K D D K D P D D K K D P D D P D D P P K P K D P K D D D D D Z K K K P D P Z D K K K K P D K K K D D P D K D P K P P P P P D D K P P K P D K P K P D P D D K K P K P P Z D P D P D P K P K D P D K P P P P P D D K D P D D D D P P D K D P D K P K P P P K P P K P P P P D K P D K P K K P P D P D K P Z K D D P P P K P P P P K Z D D P D K P K K K Z D D Z D D K D P D K D K K D K D P P D K P K D K P P K D D D D K D P D D Z K
FP
DEAD
D K D K D P D K K P P P K K D D P K P P K K K P K D P D D K D P K D D K D P K D P K K P P D K D P P K K P D K P P K K P D P D K D D P K K D P K D P D D D K P K D K D D P P D K P K K P P D P K K P P K D D K D K D P K P K P P D K D D D P P K K K K P K P K K K D D K K P D D P D D K D K D K D K P K P D P K D D D D K D P K D P K P D K K P P K P P P P D P K K P K K P P P K P D P K P P D K P K D P P P P P K D P D D K P P K D D P D P P P P K P D D K D K D D P P D P P P K K D P P K P K P K K D D K D K P K K D D D D P K K P K D D K P D P K P D K P K D P P P K P K P P P P K P K K P K P D K D P K K K K P D P P P D K P P P D D K P D K P K P D K D K D D K D P K P K P D D D K P K P P K P D D P D K D K K K K D K D D K P P P P K P D P P P P P D P D P P D D D D D K P K D K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K
P P D K D K P P D P P K K P P D P K D K K P K K P K P P K P K P P D D K D P K P K K K P K D P K D D D D P K D D K D P D P P P D P D K K K D D P D P D K D K K P D D P K D K K P P P P K D K K P P K P P D P K P K D P P K D P P P D D P P P P P K K P D K D K P D D P D D K D P P D K D P P P P K D K D P D K K P K P K D P D D K P K P D D P K P K D K K P P P P K P D D D K K P K D P K P P P K D P K D K D P P P K D D P D K P D K P K D D D K D D K K P P P K P K K D P D P P D P K K D P D K D K D D P P K P K P K D P D D P K K P D P P P P K P K P K P K K D K K D K K K D K K K P P K P D P K P K K P K P K P D P D D D D P K P K P P K K P P D P D K K D K D P D K P K K D K K K K D K D K D D P P K K P P D D P K P D P D D P D K D K P K K P P D P K P D D K D D K D P K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K
D K P D P P D P K D P P D K P K P P K D K K D D P P K D P D K D D D K P P P K K K K P P D P D D D D K D P P K P P K D D D P D P P K P K K K K P D P D D D D K K P P D K K P K K K D K K P D P K P K P K P P P K P P K K D D D D D P K D P K D K D D K P P P K K P K D K D D P P D D K P P D D K D P P K K K D K P D P D K D K K P P P P P D P D P D P K P D P K D K K K D P D D P K D D D K K P K D P D P P K P K D P D P D D P K D K K P P K D K P D P K P P K D P D K P D K D P P D D D K K P P P D K K D P D P D K D D D K P P P D D D D D P K P D P K P K K D P K D D K D K P D P P D D D K D D K D K K D D K K P K D K P P D P D D K K P P D D K D P D P D K D K P K K D P P D D K K K P D D P D P K K D K D P D D D D D D P K K K P P K D D P D D K D P D P P P D K K P P P K P D K K D P P D D K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K
P P P D D D P P P D P P P P P P P D D P D D D P P D P P D P P D P D P D P D P P P D P D P D P P P P D D P P P D D D P D D P P D D P P D D P P P P P D D D P P D D D P P D D D D D D D P P D P P P P P P D P D P P P P D P P P D P D D P D P D D D D P D D D D D P P P D P D D P P D D P D P D D P P P D D D P P D P D D P P D P P P P P P D P D P P P P P D D P P P D P P P D P D P D P D P P P D P P D P P P P D P D P D D P D P D P P D P D D D D P P P D D D P D P P P D D P D D D P P D D D D P P P D P D P P D D D P P P P D P P P D
回复
共 4 条回复,欢迎继续交流。
正在加载回复...