求救,10分都没有
查看原帖
求救,10分都没有
523541
Onana_in_XMFLS楼主2021/11/4 22:41

RT 死循环

#include <bits/stdc++.h>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
#define mem(l,val) memset((l),(val),(sizeof(l)))
using namespace std;
const int INF = 0x3f3f3f3f;
char pig[15][4005]; //手牌
stack <char> card; //牌堆
string op[15]; //身份
int hp[15],n,m,tmp,down[15]; //血量 牌的下标
bool die[15],worse[15],bad[15],good[15],used[15],god[15]; //死亡标志 类反猪标志 跳反标志 跳忠标志 用没用过杀 有没有武器
char x; //temp
inline void take(int x,int num) //摸num张牌
{
    while(num--)
    {
        pig[x][++down[x]] = card.top();
        if(card.size() != 1) card.pop();
    }
}
inline int check() //判断游戏是否结束 0是未结束 1是结束且主猪胜利 2是结束且反猪胜利
{
    if(die[1]) return 2;
    for(int i = 2;i <= n;++i)
        if(!die[i] && op[i][0] == 'F') return 0;
    return 1;
}
inline void write(int res) //根据结果输出
{
    if(res == 1) puts("MP");
    else puts("FP");
    for(int i = 1;i <= n;++i)
    {
        if(die[i]) {puts("DEAD");continue;}
        for(int j = 1;j <= down[i];++j)
            if(pig[i][j] != '0') cout<<pig[i][j]<<" ";
        puts("");
    } 
}
inline int kill(int a,int b) //第a只猪杀第b只猪
{
    for(int i = 1;i <= down[b];++i)
        if(pig[b][i] == 'D') {pig[b][i] = '0';return 0;}
    --hp[b];
    if(hp[b] <= 0)
    {
        for(int i = 1;i <= down[b];++i)
            if(pig[b][i] == 'P') {pig[b][i] = '0';++hp[b];return 0;}
        die[b] = 1;
        if(op[b][0] == 'F') take(a,3);
        else if(op[b][0] == 'Z' && op[a][0] == 'M')
        {
            god[a] = 0;
            for(int i = 1;i <= down[a];++i) pig[a][i] = '0';
        }
        int ch = check();
        if(ch) {write(ch);exit(0);}
    }
    return 0;
}
inline void show(int x,int y) //打第x只猪的第y张牌,即pig[x][y]
{
    if(pig[x][y] == 'P' && hp[x] < 4) {++hp[x];pig[x][y] = '0';}
    if(pig[x][y] == 'Z') {god[x] = 1;pig[x][y] = '0';}
    if(pig[x][y] == 'K' && (!used[x] || god[x]))
    {
        int goal = (x+1)%n;
        if(x+1 == n) goal = n;
        while(die[goal]) goal = (goal+1)%n;
        if(op[x][0] == 'M' && (bad[goal] || worse[goal]))
            tmp = kill(x,goal),used[x] = 1,pig[x][y] = '0';
        if(op[x][0] == 'Z' && bad[goal])
            tmp = kill(x,goal),used[x] = 1,pig[x][y] = '0',good[x] = 1;
        if(op[x][0] == 'F' && good[goal])
            tmp = kill(x,goal),used[x] = 1,pig[x][y] = '0',bad[x] = 1;
    }
}
int main(int argc,char *argv[])
{
    //freopen("data.ans","r",stdin);
    //freopen("data.out","w",stdout);
    scanf("%d%d",&n,&m);
    fill(hp+1,hp+n+1,4);
    good[1] = 1;
    for(int i = 1;i <= n;++i)
        for(int j = 0;j < 4005;++j) pig[i][j] = '0';
    for(int i = 1;i <= n;++i)
    {
        cin>>op[i];
        for(int j = 0;j < 4;++j) {cin>>pig[i][++down[i]];}
    }
    for(int i = 1;i <= m;++i) {cin>>x;card.push(x);}
    while(1)
    {
        for(int i = 1;i <= n;++i)
        {
            used[i] = 0;
            take(i,2);
            for(int j = 1;j <= down[i];++j)
                if(pig[i][j] != '0') show(i,j);
        }
    }
    return 0;
}/*
3 1
MP K K K K
ZP K K K K
FP K K K K
K  */
2021/11/4 22:41
加载中...