听棺多,代码CE求条,悬关
  • 板块灌水区
  • 楼主bananamilktea
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/22 17:36
  • 上次更新2025/1/22 17:40:28
查看原帖
听棺多,代码CE求条,悬关
736746
bananamilktea楼主2025/1/22 17:36
#include<bits/stdc++.h>

using namespace std;

const int MAXN = 1e3 + 1; 

int six_id;
int feel_six_pig[MAXN];           //feel_six_pig表示主猪堆第i个人的印象 
int ide[MAXN];                    //ide表示这个人是跳忠还是跳反 
int n, m;
vector<char> cards;               //抽牌堆 
set<pair<int, char>> st[MAXN];    //每个人手牌具体位置 
bool weapon[MAXN];
map<char, int> pigs_card[MAXN];   //每个人的手牌 
int pigs_hp[MAXN];                //血量 
int pigs_type[MAXN];              //种类,记录当前猪是忠猪,主猪还是反猪 

void print();
bool offset(int x, bool help);
void check_demage(int x, int y) { //判断是否死亡,如果死亡,判断是谁杀死的 
    if(pigs_hp[x] == 0) {
    	if(pigs_type[x] == 1) {
    		print();
		}
		int bad = 0;
		for(int i = 1; i <= n; i++) {
    		bad += (pigs_type[i] == 3 && pigs_hp[i] > 0);
		}
		if(bad == 0) {
			print();
		}
        if(pigs_type[y] == 1 && pigs_type[x] == 2) {    //大逆不道的主猪杀死了忠猪 
            pigs_card[y].clear();                       //小小的惩罚 
        }
        if(pigs_type[x] == 3) {                         //小小的奖励 
            for(int i = 1; i <= 3; i++) {
                pigs_card[x][cards[cards.size() - 1]]++;
                cards.pop_back();
            }
        }
    }
    else {                                             //改变伤害来源对全体猪的印象 
        if(pigs_type[x] == 1) {
            ide[y] = 3;
            feel_six_pig[y] = 1;
        }
        if(pigs_type[x] == 2) {
            ide[y] = 3;
        }
        if(pigs_type[x] == 3) {
            ide[y] = (y == six_id ? 1 : 2);
        }
    }
    return;
}
void Fight(int x, int y) {                            //决斗 
	if(offset(y, true)) {
		return;
	}
    bool turn = true;
    if(pigs_type[y] == 2 && pigs_type[x] == 1) {      //忠猪不打主猪 
        pigs_hp[y]--;
        check_demage(y, x);
    }
    while(1) {
        if(turn == true) {
            if(pigs_card[y]['K'] == 0) {
                break;
            }
            else {
                pigs_card[y]['K']--;
            }
        }
        else {
            if(pigs_card[x]['K'] == 0) {
                break;
            }
            else {
                pigs_card[x]['K']--;
            }
        }
        turn = !turn;
    }
    if(turn) {
        pigs_hp[y]--;
        check_demage(y, x);
    }
    else {
        pigs_hp[x]--;
        check_demage(x, y);
    }
    return;
}
bool offset(int x, bool help) {    //无懈可击抵消的阶段, help表示此轮如果使用无懈可击是表敌意还是献殷勤 
	int type_now = ide[x];
	int now = x % n + 1;
	if(type_now == 0) {
		return false;
	}
	if(ide[x] && pigs_card[x]['J'] && help) {                                                                    //自己手上有无懈可击并且表明身份,对自己有用则直接使用 
		pigs_card[x]['J']--;
		return offset(x, !help);
	}
	while(now != x) {
		if(pigs_card[now]['J'] && ide[now]) {
			if((type_now == 1 || type_now == 2) && help && (pigs_type[x] == 1 || pigs_type[x] == 2)) {          //都是主猪忠猪,互相帮助 
				ide[now] = (now == six_id ? 1 : 2);
				pigs_card[now]['J']--;
				return offset(now, !help);
			}
			if((type_now == 1 || type_now == 2) && !help && pigs_type[x] == 3) {                                //反猪对忠猪主猪表敌意 
				ide[now] = 3;
				pigs_card[now]['J']--;
				return offset(now, !help);
			}
			if(type_now == 3 && !help && (pigs_type[x] == 1 || pigs_type[x] == 2)) {                            //忠猪主猪对反猪表敌意 
				ide[now] = (now == six_id ? 1 : 2);
				pigs_card[now]['J']--;
				return offset(now, !help);
			}
			if(type_now == 3 && help && pigs_type[x] == 3) {                                                    //反猪对反猪献殷勤 
				ide[now] = -1;
				pigs_card[now]['J']--;
				return offset(now, !help);
			}
		}
		now = now % n + 1;
	}
	return false;
}
void Shoot(int x) {                //万箭齐发 
	for(int i = x + 1; i <= n; i++) {
		if(offset(i, true)) {
			continue;
		}
		if(!pigs_card[i]['D']) {
			pigs_hp[i]--;
			check_demage(i, x);
		}
		else {
			pigs_card[i]['D']--;
		}
	}
	for(int i = 1; i < x; i++) {
		if(offset(i, true)) {
			continue;
		}
		if(!pigs_card[i]['D']) {
			pigs_hp[i]--;
			check_demage(i, x);
		}
		else {
			pigs_card[i]['D']--;
		}
	}
	return;
} 
void male_pig(int x) {                  //男猪入侵 
	for(int i = x + 1; i <= n; i++) {
		if(offset(i, true)) {
			continue;
		}
		if(!pigs_card[i]['K']) {
			pigs_hp[i]--;
			check_demage(i, x);
		}
		else {
			pigs_card[i]['K']--;
		}
	}
	for(int i = 1; i < x; i++) {
		if(offset(i, true)) {
			continue;
		}
		if(!pigs_card[i]['K']) {
			pigs_hp[i]--;
			check_demage(i, x);
		}
		else {
			pigs_card[i]['K']--;
		}
	}
	return;
}
void Kill(int x, int y) {
	if(pigs_card[y]['D']) {
		pigs_card[y]['D']--;
		return;
	}
	else {
		pigs_hp[y]--;
		check_demage(y, x);
	}
}
int Find(int x) {           //找冤大头表敌意 
	int now = x % n + 1;
	while(now != x) {
		if(!pigs_hp[now]) {
			now = x % n + 1;
			continue;
		}
		if((pigs_type[x] == 1 || pigs_type[x] == 2) && ide[now] == 3 || pigs_type[x] == 3 && (ide[now] == 1 || ide[now] == 2) || pigs_type[x] == 1 && feel_six_pig[now] == 1) {
			return now;
		}
		else {
			break;
		}
	}
	now = (x - 1 == 0 ? n : x - 1);
	while(now != x) {
		if(!pigs_hp[now]) {
			now = (x - 1 == 0 ? n : x - 1);
			continue;
		}
		if((pigs_type[x] == 1 || pigs_type[x] == 2) && ide[now] == 3 || pigs_type[x] == 3 && (ide[now] == 1 || ide[now] == 2) || pigs_type[x] == 1 && feel_six_pig[now] == 1) {
			return now;
		}
		else {
			break;
		}
	}
	return -1;
}
bool check(int x, char c) {
	if(c == 'K' || c == 'F') {
		int now = Find(x);
		if(now == -1) {
			return false;
		}
		else {
			if(c == 'K') {
				Kill(x, now);
			}
			else {
				Fight(x, now);
			}
		}
	}
	else if(c == 'D' || c == 'J') {
		return false;
	}
	else if(c == 'Z') {
		weapon[x] = true;
		return true;
	}
	else if(c == 'P') {
		pigs_hp[x]++;
		return true;
	}
	else if(c == 'N') {
		male_pig(x);
		return true;
	}
	else {
		Shoot(x);
		return true;
	}
}
void pigs_round(int x) {
	bool Kill_used = false;
	for(auto i : st) {
		if(Kill_used && i.second == 'K') {
			continue;
		}
		if(check(x, i.second)) {
			mp[x][i.second]--;
			st.erase(i);
			Kill_used |= (i.second == 'K');
			break;
		}
	} 
	return;
}
void read() {                      //输入 
	
}
void init() {                      //初始化 
	
}
void start() {                     //回合开始 
	
}
void print() {                     //输出 
}

int main() {
    read();
    init();
    start();
    print();
    return 0;
}

具体报错的位置是代码的第262行if(Kill_used && i.second == 'K') {,但是不知道报错信息的意思以及修改方法

2025/1/22 17:36
加载中...