记录编号 |
550505 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[SDOI 2010] 猪国杀 |
最终得分 |
100 |
用户昵称 |
夜莺 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.015 s |
提交时间 |
2020-03-10 18:52:52 |
内存使用 |
3.18 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
struct node{
int HP; //血量
int number; //手牌数量
bool zhuge; //是否装备诸葛
int last; //上一个玩家的位置
int next; //下一个玩家的位置
char ID; //身份
char card[2010]; //手牌
}pig[11]; //每只猪的东西
char paidui[2010]; //牌堆
char eye[11]; //主猪眼中i号猪的身份
int n,m; //输入数据
int FP; //反猪的数量
bool over; //游戏是否结束
void MP(int man){ //摸牌(man指要摸的猪)
pig[man].number++;
pig[man].card[pig[man].number]=paidui[m];
if(m>1)
m--;
}
void JS(int ing,int ed){ //判断是否被击杀(ing指杀猪者,ed指虚血者)
for(int i=1;i<=pig[ed].number;i++){
if(pig[ed].card[i]=='P'){ //要吃活了
pig[ed].card[i]='U';
pig[ed].HP++;
return;
}
}
pig[pig[ed].next].last=pig[ed].last; //改变距离
pig[pig[ed].last].next=pig[ed].next;
if(pig[ed].ID=='M'){
over=true;
return;
}
if(pig[ed].ID=='F'){
FP--;
if(!FP){
over=true;
return;
}
for(int i=1;i<=3;i++) //猪猪击杀反猪的奖励(摸牌)
MP(ing);
}
if(pig[ed].ID=='Z'){ //忠猪被杀
if(pig[ing].ID=='M'){ //主猪击杀忠猪的奖励(弃牌)
pig[ing].number=0;
pig[ing].zhuge=false;
}
}
}
bool WX(int ing,int ed,bool fu){ //ing为要使用锦囊的猪,ed为要使用无懈的猪,当fu=1或0时指找与ed同种或非同种的猪
int i=ing; //i指将要查看的猪
while(1){
if(fu){ //找同种的猪
if(eye[ed]==pig[i].ID||(eye[ed]=='M'&&pig[i].ID=='Z')||(eye[ed]=='Z'&&pig[i].ID=='M')){
for(int j=1;j<=pig[i].number;j++){
if(pig[i].card[j]=='J'){
pig[i].card[j]='U';
eye[i]=pig[i].ID;
return !WX(i,ing,0);
}
}
}
}
else{ //找非同种的猪
if(((pig[i].ID=='M'||pig[i].ID=='Z')&&eye[ing]=='F')||(pig[i].ID=='F'&&(eye[ing]=='M'||eye[ing]=='Z'))){
for(int j=1;j<=pig[i].number;j++){
if(pig[i].card[j]=='J'){
pig[i].card[j]='U';
eye[i]=pig[i].ID;
return !WX(i,ing,0);
}
}
}
}
i=pig[i].next;
if(i==ing) //没找到
return false;
}
}
void CZ(int ing,int ed){ //杀猪(ing为杀猪的猪,ed为被杀的猪)
for(int i=1;i<=pig[ed].number;i++){ //开始找闪避
if(pig[ed].card[i]=='D'){
pig[ed].card[i]='U';
return;
}
}
pig[ed].HP--;
if(!pig[ed].HP)
JS(ing,ed);
}
void JD(int ing,int ed){ //决斗(ing为发起决斗的猪,ed为被决斗的猪)
if(pig[ing].ID=='M'&&pig[ed].ID=='Z'){
pig[ed].HP--;
if(!pig[ed].HP)
JS(ing,ed);
return;
}
if(WX(ing,ed,1))
return;
int i,j;
i=j=1;
while(1){ //开始死斗
while(pig[ed].card[i]!='K'&&i<=pig[ed].number) //被决斗的猪开始杀猪
i++;
if(i>pig[ed].number){
pig[ed].HP--;
if(!pig[ed].HP)
JS(ing,ed);
return;
}
pig[ed].card[i]='U';
while(pig[ing].card[j]!='K'&&j<=pig[ing].number) //发起决斗的猪开始杀猪
j++;
if(j>pig[ing].number){
pig[ing].HP--;
if(!pig[ing].HP)
JS(ed,ing);
return;
}
pig[ing].card[j]='U';
}
}
void NM(int man){ //南蛮(man指发起南蛮的猪)
for(int i=pig[man].next;i!=man;i=pig[i].next){ //开始轮流杀猪
if(WX(man,i,1))
continue;
int j;
for(j=1;j<=pig[i].number;j++){
if(pig[i].card[j]=='K'){
pig[i].card[j]='U';
break;
}
}
if(j>pig[i].number){
pig[i].HP--;
if(pig[i].ID=='M'&&eye[man]=='U'){
eye[man]='L';
}
if(!pig[i].HP){
JS(man,i);
if(over)
return;
}
}
}
}
void WJ(int man){ //万贱(man指发起万贱的猪)
for(int i=pig[man].next;i!=man;i=pig[i].next){ //开始轮流闪避
if(WX(man,i,1))
continue;
int j;
for(j=1;j<=pig[i].number;j++){
if(pig[i].card[j]=='D'){
pig[i].card[j]='U';
break;
}
}
if(j>pig[i].number){
pig[i].HP--;
if(pig[i].ID=='M'&&eye[man]=='U'){
eye[man]='L';
}
if(!pig[i].HP){
JS(man,i);
if(over)
return;
}
}
}
}
void begin(){ //开始玩游戏
over=true;
if(FP)
over=false;
if(over)
return;
for(int i=1;i;i=pig[i].next){
for(int j=1;j<=2;j++) //摸牌
MP(i);
bool use=false; //是否已经杀猪
for(int j=1;j<=pig[i].number;j++){ //出牌
if(pig[i].card[j]=='U')
continue;
if(!pig[i].HP) //死亡
break;
if(pig[i].HP<4&&pig[i].card[j]=='P'){ //吃桃
pig[i].HP++;
pig[i].card[j]='U';
continue;
}
if(pig[i].card[j]=='K'){ //杀猪
if(use&&!pig[i].zhuge)
continue;
if(pig[i].ID=='M'&&eye[pig[i].next]!='L'&&eye[pig[i].next]!='F')
continue;
if(pig[i].ID=='Z'&&eye[pig[i].next]!='F')
continue;
if(pig[i].ID=='F'&&eye[pig[i].next]!='Z'&&eye[pig[i].next]!='M')
continue;
pig[i].card[j]='U';
CZ(i,pig[i].next);
eye[i]=pig[i].ID;
use=true;
if(over)
return;
}
if(pig[i].card[j]=='F'){ //决斗
if(pig[i].ID=='F'){ //反猪发起决斗
pig[i].card[j]='U';
JD(i,1); //反猪专打主猪
eye[i]=pig[i].ID; //跳反
}
if(pig[i].ID=='M'){ //主猪发起决斗
for(int k=pig[i].next;k!=i;k=pig[k].next){ //主猪专打(类)反猪
if(eye[k]=='L'||eye[k]=='F'){
pig[i].card[j]='U';
JD(i,k);
eye[i]=pig[i].ID; //跳忠
j=0;
break;
}
}
}
if(pig[i].ID=='Z'){ //忠猪发起决斗
for(int k=pig[i].next;k!=i;k=pig[k].next){ //忠猪专打反猪
if(eye[k]=='F'){
pig[i].card[j]='U';
JD(i,k);
eye[i]=pig[i].ID; //跳忠
j=0;
break;
}
}
}
if(over)
return;
continue;
}
if(pig[i].card[j]=='N'){ //南蛮
pig[i].card[j]='U';
NM(i);
if(over)
return;
j=0;
continue;
}
if(pig[i].card[j]=='W'){ //万贱
pig[i].card[j]='U';
WJ(i);
if(over)
return;
j=0;
continue;
}
if(pig[i].card[j]=='Z'){ //诸葛
pig[i].zhuge=true;
pig[i].card[j]='U';
if(use){
use=false;
j=0;
}
continue;
}
}
}
}
int main(){ //准备工作
freopen("kopk.in","r",stdin);
freopen("kopk.out","w",stdout);
scanf("%d %d\n",&n,&m);
for(int i=1;i<=n;i++){ //标明距离
pig[i].last=i-1;
pig[i].next=i+1;
}
pig[1].last=n;
pig[n].next=1;
for(int i=1;i<=n;i++){
eye[i]='U';
for(int j=1;j<=m;j++)
pig[i].card[j]='U';
}
eye[1]='M';
for(int i=1;i<=n;i++){
char fu[2];
scanf("%s %c %c %c %c\n",fu,&pig[i].card[1],&pig[i].card[2],&pig[i].card[3],&pig[i].card[4]);
pig[i].ID=fu[0];
pig[i].number=pig[i].HP=4;
pig[i].zhuge=false;
if(pig[i].ID=='F')
FP++;
}
for(int i=1;i<m;i++){
scanf("%c ",&paidui[m-i+1]);
}scanf("%c",&paidui[1]);
begin();
if(!pig[1].HP)
printf("FP\n");
else printf("MP\n");
for(int i=1;i<=n;i++){
if(pig[i].HP<=0) //战死沙场
printf("DEAD");
else{ //亮牌
for(int j=1;j<=pig[i].number;j++)
if(pig[i].card[j]!='U')
printf("%c ",pig[i].card[j]);
}
printf("\n");
}
return 0;
}