Luogu P2482 Code

P2482

#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>

using std::cout;
using std::endl;
using std::cin;
using std::ios;

#define CANNOT_USE_THIS_CARD      true
#define CAN_USE_THIS_CARD         false
#define THIS_PIG_IS_DEAD          true
#define THIS_PIG_IS_NOT_DEAD      false
#define THIS_PIG_IS_JUMP          true
#define THIS_PIG_IS_NOT_JUMP      false
#define THIS_PIG_LIKE_BAD         true
#define THIS_PIG_DO_NOT_LIKE_BAD  false
#define CROSSBOW_ON               true
#define CROSSBOW_DOWN             false
#define THIS_TURN_USED_KILL       true
#define THIS_TURN_DO_NOT_USE_KILL false

struct card
{
    char                    which                   ;
    bool                    use                     ;
};

typedef std::vector<card>::iterator myit;

class pig
{
private:
    int                     hp                      ;
    bool                    use_kill                ;
    bool                    crossbow                ;
    bool                    jumped                  ;
    bool                    like_bad                ;
    void                    die         (int)       ;
    void                    clear       (void)      ;
    void                    del         (myit&)     ;
    myit                    find        (char)      ;
    void                    cut         (void)      ;
    void                    use         (card&)     ;
    void                    hurt        (int)       ;
    bool                    canuse      (char)      ;
    int                     find_K      (void)      ;
    int                     find_F      (void)      ;
    bool                    K_respond   (void)      ;
    bool                    N_respond   (void)      ;
    bool                    W_respond   (void)      ;
    bool                    ask_J       (int)       ;
    bool                    back_J      (int)       ;
public:
                            pig         (void)      ;
    int                     num                     ;
    bool                    dead                    ;
    std::string             name                    ;
    std::vector<card>       cards                   ;
    void                    myturn      (void)      ;
    void                    jump        (void)      ;
    void                    K           (int)       ;
    void                    F           (int)       ;
    void                    N           (void)      ;
    void                    W           (void)      ;
};

void gameover(std::string);

int n,m;
int FP;
card stack[2005];
pig member[15];
int top=1;

int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(register int i=1;i<=n;i++)
    {
        cin>>member[i].name;
        member[i].num=i;
        if(member[i].name=="FP") FP++;
        for(register int j=1;j<=4;j++)
        {
            card c;
            cin>>c.which;
            c.use=CAN_USE_THIS_CARD;
            member[i].cards.push_back(c);
        }
    }
    for(top=1;top<=m;top++)
    {
        card c;
        cin>>c.which;
        c.use=CAN_USE_THIS_CARD;
        stack[top]=c;
    }
    top=1;
    int point=0;
    member[1].jump();
    while(true)
    {
        point=point%n+1;
        if(member[point].dead==THIS_PIG_IS_DEAD) continue;
        member[point].myturn();
    }
}

void gameover(std::string who)
{
    cout<<who<<std::endl;
    for(register int i=1;i<=n;i++)
    {
        if(member[i].dead==THIS_PIG_IS_DEAD) cout<<"DEAD";
        else for(myit it=member[i].cards.begin();it!=member[i].cards.end();it++)
        {
            if(it->use==CANNOT_USE_THIS_CARD) continue;
            cout<<it->which<<' ';
        }
        cout<<std::endl;
    }
    exit(0);
}

void pig::die(int who)
{
    this->dead=THIS_PIG_IS_DEAD;
    if(this->name=="MP")
        gameover("FP");
    if(this->name=="FP") FP--;
    if(FP==0) gameover("MP");
    if(this->name=="FP")
    {
        member[who].cut();
        member[who].cut();
        member[who].cut();
    }
    if(this->name=="ZP"&&member[who].name=="MP")
        member[who].clear();
    return;
}

void pig::clear(void)
{
    this->cards.clear();
    this->crossbow=CROSSBOW_DOWN;
    return;
}

void pig::del(myit& it)
{
    it->use=CANNOT_USE_THIS_CARD;
    return;
}

myit pig::find(char which)
{
    for(myit it=this->cards.begin();it!=this->cards.end();it++)
    {
        if(it->use==CANNOT_USE_THIS_CARD) continue;
        if(it->which==which) return it;
    }
    return this->cards.end();
}

void pig::cut(void)
{
    this->cards.push_back(stack[top++]);
    if(top>m) top=m;
    return;
}

void pig::use(card& c)
{
    if(c.which=='K')
    {
        int who;
        who=this->find_K();
        if(who!=0)
        {
            c.use=CANNOT_USE_THIS_CARD;
            this->K(who);
        }
    }
    else if(c.which=='P')
    {
        if(this->hp<4)
        {
            c.use=CANNOT_USE_THIS_CARD;
            this->hp++;
        }
    }
    else if(c.which=='F')
    {
        int who;
        who=this->find_F();
        if(who!=0)
        {
            c.use=CANNOT_USE_THIS_CARD;
            this->F(who);
        }
    }
    else if(c.which=='N')
    {
        c.use=CANNOT_USE_THIS_CARD;
        this->N();
    }
    else if(c.which=='W')
    {
        c.use=CANNOT_USE_THIS_CARD;
        this->W();
    }
    else if(c.which=='Z')
    {
        c.use=CANNOT_USE_THIS_CARD;
        this->crossbow=CROSSBOW_ON;
    }
    return;
}

void pig::hurt(int who)
{
    this->hp--;
    if(this->hp==0)
    {
        myit t=this->find('P');
        if(t==this->cards.end()) this->die(who);
        else
        {
            this->del(t);
            this->hp++;
        }
    }
    return;
}

bool pig::canuse(char c)
{
    if(c=='P'&&this->hp<4) return true;
    if((c=='K'&&this->find_K()!=0)||(c=='F'&&this->find_F()!=0)||c=='N'||c=='W'||c=='Z') return true;//濡傛灉鍙互鐢?
    return false;
}

int pig::find_K(void)
{
    if(this->use_kill==THIS_TURN_USED_KILL&&this->crossbow==CROSSBOW_DOWN) return 0;//濡傛灉杩欏洖鍚堝凡缁忕敤杩囦簡鏉€鑰屾病鏈夎杩囩尓鍝ヨ繛寮?
    if(this->name=="MP")
        for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
        {
            if(member[point].dead==THIS_PIG_IS_DEAD) continue;
            if(member[point].like_bad==THIS_PIG_LIKE_BAD||(member[point].name=="FP"&&member[point].jumped==THIS_PIG_IS_JUMP))
                return point;
            else return 0; 
        }
    else if(this->name=="ZP")
        for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
        {
            if(member[point].dead==THIS_PIG_IS_DEAD) continue;
            if(member[point].name=="FP"&&member[point].jumped==THIS_PIG_IS_JUMP)
                return point;
            else return 0;
        }
    else if(this->name=="FP")
        for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
        {
            if(member[point].dead==THIS_PIG_IS_DEAD) continue;
            if(member[point].name!="FP"&&member[point].jumped==THIS_PIG_IS_JUMP)
                return point;
            else return 0;
        }
    return 0;
}

int pig::find_F(void)
{
    if(this->name=="MP")
        for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
        {
            if(member[point].dead==THIS_PIG_IS_DEAD) continue;
            if(member[point].like_bad==THIS_PIG_LIKE_BAD||(member[point].name=="FP"&&member[point].jumped==THIS_PIG_IS_JUMP))
                return point;
        }
    else if(this->name=="ZP")
        for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
        {
            if(member[point].dead==THIS_PIG_IS_DEAD) continue;
            if(member[point].name=="FP"&&member[point].jumped==THIS_PIG_IS_JUMP)
                return point;
        }
    else if(this->name=="FP") return 1;
    return 0;
}

bool pig::K_respond(void)
{
    myit it=this->find('D');
    if(it==this->cards.end()) return false;
    this->del(it);
    return true;
}

bool pig::N_respond(void)
{
    myit it=this->find('K');
    if(it==this->cards.end()) return false;
    this->del(it);
    return true;
}

bool pig::W_respond(void)
{
    myit it=this->find('D');
    if(it==this->cards.end()) return false;
    this->del(it);
    return true;
}

bool pig::ask_J(int who)
{
    bool check=true;
    if(this->jumped==THIS_PIG_IS_NOT_JUMP) return false;
    for(register int point=who;point!=who||check==true;point=point%n+1)
    {
        if(member[point].dead==THIS_PIG_IS_DEAD) continue;
        check=false;
        if(this->name!="FP"&&member[point].name=="FP") continue;
        if(this->name=="FP"&&member[point].name!="FP") continue;
        myit it=member[point].find('J');
        if(it!=member[point].cards.end())
        {
            member[point].del(it);
            member[point].jump();
            return !member[point].back_J(this->num);
        }
    }
    return false;
}

bool pig::back_J(int to)
{
    for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
    {
        if(member[point].dead==THIS_PIG_IS_DEAD) continue;
        if(this->name!="FP"&&member[point].name=="ZP") continue;
        if(this->name=="FP"&&member[point].name=="FP") continue;
        if(this->name=="ZP"&&member[point].name!="FP") continue;
        myit it=member[point].find('J');
        if(it!=member[point].cards.end())
        {
            member[point].del(it);
            member[point].jump();
            return !member[to].ask_J(point);
        }
    }
    return false;
}

pig::pig(void)
{
    this->hp=4;
    this->dead=THIS_PIG_IS_NOT_DEAD;
    this->jumped=THIS_PIG_IS_NOT_JUMP;
    this->crossbow=CROSSBOW_DOWN;
    this->like_bad=THIS_PIG_DO_NOT_LIKE_BAD;
    this->use_kill=THIS_TURN_DO_NOT_USE_KILL;
    return;
}

void pig::myturn(void)
{
    this->cut();
    this->cut();
    bool check=true;
    while(check) 
    {
        check=false;
        for(myit it=this->cards.begin();it!=this->cards.end();it++)
        {
            if(it->use==CANNOT_USE_THIS_CARD) continue;
            if(canuse(it->which)==false) continue;
            use(*it);
            if(this->dead==THIS_PIG_IS_DEAD) return;
            it=this->cards.begin()-1;
            check=true;
        }
    }
    member[this->num].use_kill=THIS_TURN_DO_NOT_USE_KILL;
    return;
}

void pig::jump(void)
{
    this->jumped=THIS_PIG_IS_JUMP;
    return;
}

void pig::K(int to)
{
    if(this->use_kill==THIS_TURN_USED_KILL&&this->crossbow==false) return;
    this->jump();
    this->like_bad=THIS_PIG_DO_NOT_LIKE_BAD;
    this->use_kill=THIS_TURN_USED_KILL;
    if(member[to].K_respond()==false)
        member[to].hurt(this->num);
    return;
}

void pig::F(int to)
{
    this->jump();
    this->like_bad=THIS_PIG_DO_NOT_LIKE_BAD;
    if(member[to].ask_J(this->num)==true) return;
    if(this->name=="MP"&&member[to].name=="ZP")
    {
        member[to].hurt(this->num);
        return;
    }
    int who;
    while(true)
    {
        myit t;
        t=member[to].find('K');
        if(t==member[to].cards.end())
        {
            who=2;
            break;
        }
        else member[to].del(t);
        t=this->find('K');
        if(t==this->cards.end())
        {
            who=1;
            break;
        }
        else this->del(t);
    }
    if(who==2)
        member[to].hurt(this->num);
    if(who==1)
        this->hurt(to);
    return;
}

void pig::N(void)
{
    for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
    {
        if(member[point].dead==THIS_PIG_IS_DEAD) continue;
        if(member[point].ask_J(this->num)==true) continue;
        if(member[point].N_respond()==false) 
        {
            member[point].hurt(this->num);
            if(member[point].name=="MP"&&this->jumped==THIS_PIG_IS_NOT_JUMP)
            {
                this->like_bad=THIS_PIG_LIKE_BAD;
            }
        }
    }
    return;
}

void pig::W(void)
{
    for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
    {
        if(member[point].dead==THIS_PIG_IS_DEAD) continue;
        if(member[point].ask_J(this->num)==true) continue;
        if(member[point].W_respond()==false)
        {
            member[point].hurt(this->num);
            if(member[point].name=="MP"&&this->jumped==THIS_PIG_IS_NOT_JUMP)
                this->like_bad=THIS_PIG_LIKE_BAD;
        }
    }
    return;
}

转载自本人Luogu Blog这篇文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容