【悬赏关注】猪国杀0分代码求调
  • 板块学术版
  • 楼主Milky_Cat
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/1/13 20:51
  • 上次更新2023/10/24 04:22:59
查看原帖
【悬赏关注】猪国杀0分代码求调
906320
Milky_Cat楼主2023/1/13 20:51

我用了骗分做法,手牌没有从左往右存,但是0分,TLE一个点,其余全部WA。代码:

#include<bits/stdc++.h>
using namespace std;
int n, m;
int pai[11][9] = {}; //P K D F N W J Z
char pk[1001] = {}, ch, pg[2],gg[9]={"PKDFNWJZ"};
int jl[11][11], sf[11], gksf[11] = {}, xl[11], zb[11], head = 0, mp = 0, fp = 0, isend = 0;
void die(int i, int ly) {
	if (sf[i] == 0) {
		mp--;//主猪挂了,别玩了
		isend = 1; //GAME OVER
		return;//不用更新距离了
	} else if (sf[i] == 1) { //是反猪
		fp--;
		if (fp == 0) { //大团圆的结局(反猪被打完了)
			isend = 1; //GAME OVER
			return;//也不用更新距离了
		} else { //干了反猪,可以啊,加工资!
			for (int j = 0; j < 3; j++) {
				ch = pk[head++];
				switch (ch) {
					case 'P':
						pai[ly][0]++;
						break;
					case 'K':
						pai[ly][1]++;
						break;
					case 'D':
						pai[ly][2]++;
						break;
					case 'F':
						pai[ly][3]++;
						break;
					case 'N':
						pai[ly][4]++;
						break;
					case 'W':
						pai[ly][5]++;
						break;
					case 'J':
						pai[ly][6]++;
						break;
					case 'Z':
						pai[ly][7]++;
						break;//手牌分类
				}
			}
		}
	} else if (sf[i] == 2 && sf[ly] == 0) { //主猪杀了忠猪
		for (int j = 0; j < 8; j++)pai[ly][j] = 0; //清空所有手牌
	}
	for (int j = 0; j < n; j++) {
		for (int kk = 0; kk < n; kk++) {
			if (j == kk)jl[j][kk] = 0;
			else if (kk > i)jl[j][kk]--; //更新距离
		}
	}
}
void binsi(int i, int ly) {
	if (pai[i][0]) {
		pai[i][0]--;//吃个桃桃,好凉凉
		xl[i]++;
	} else die(i, ly); //这头猪被宰了
}
void nzrq(int scr) {
	for (int i = 0; i < n; i++) {
		if (i == scr || xl[i] == 0) { //是伤害来源或者已经没了
			continue;
		} else {
			if (gksf[i] == -1 || (pai[i][1] == 0 && pai[i][6] == 0)) { //不对未表明身份的自己献殷勤
				xl[i]--;
				if (xl[i] == 0)binsi(i, scr);
				if (sf[i] == 0)gksf[scr] = 1;				
			} else {
				if (gksf[scr] == 1 && sf[i] != 1) {
					if (pai[i][6] || pai[i][1]) {
						if (pai[i][6])pai[i][6]--;
						else pai[i][1]--;
						if (gksf[i] == -1)gksf[i] = 2; //跳忠
						continue;
					} else {
						xl[i]--;
						if (xl[i] == 0)binsi(i, scr);
					}
				} else if (gksf[scr] != 1 && gksf[scr] != -1 && sf[i] == 1) {
					if (pai[i][6] || pai[i][1]) {
						if (pai[i][6])pai[i][6]--;
						else pai[i][1]--;
						if (gksf[i] == -1)gksf[i] = 1; //跳反
						continue;
					} else {
						xl[i]--;
						if (xl[i] == 0)binsi(i, scr);
					}
				} else {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				}
			}
		}
	}
}
void wjqf(int scr) {
	for (int i = 0; i < n; i++) {
		if (i == scr || xl[i] == 0) { //是伤害来源或者已经没了
			continue;
		} else {
			if (gksf[i] == -1 || (pai[i][2] == 0 && pai[i][6] == 0)) { //不对未表明身份的自己献殷勤
				xl[i]--;
				if (xl[i] == 0)binsi(i, scr);
				if (sf[i] == -1)gksf[scr] = 1;				
			} else {
				if (gksf[scr] == 1 && sf[i] != 1) {
					if (pai[i][6]) {
						if (pai[i][6])pai[i][6]--;
						else pai[i][2]--;
						if (gksf[i] == -1)gksf[i] = 2; //跳忠
						continue;
					} else {
						xl[i]--;
						if (xl[i] == 0)binsi(i, scr);
					}
				} else if (gksf[scr] != 1 && gksf[scr] != -1 && sf[i] == 1) {
					if (pai[i][6] || pai[i][2]) {
						if (pai[i][6])pai[i][6]--;
						else pai[i][2]--;
						if (gksf[i] == -1)gksf[i] = 1; //跳反
						continue;
					} else {
						xl[i]--;
						if (xl[i] == 0)binsi(i, scr);
					}
				} else {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				}
			}
		}
	}
}
void mpig(int scr) {
	while (xl[scr] < 4 && pai[scr][0] > 0) {
		pai[scr][0]--;
		xl[scr]++;
	}
	while (pai[scr][7] > 0) {
		pai[scr][7]--;
		zb[scr] = 1;
	}
	while (pai[scr][4] > 0) {
		pai[scr][4]--;
		nzrq(scr);
	}
	while (pai[scr][5] > 0) {
		pai[scr][5]--;
		wjqf(scr);
	}
	int flag = 0;
	for (int i = 0; i < n; i++) {
		if (jl[scr][i] == 0 || jl[scr][i] > 1)continue;
		if (gksf[i] == 1) { //设1为反猪或类反猪
			while (pai[scr][3]) {
				pai[scr][3]--;
				if (sf[i] == 2) {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				} else {
					if (pai[i][6]) {
						pai[i][6]--;
						continue;
					}
					if (pai[i][1] > pai[scr][1]) {
						pai[i][1] -= pai[scr][1] + 1;
						pai[scr][1] = 0;
						xl[scr]--;
						if (xl[scr] == 0) {
							binsi(scr, i);
						}
					} else {
						pai[scr][1] -= pai[i][1];
						pai[scr][1] = 0;
						xl[i]--;
						if (xl[i] == 0) {
							binsi(i, scr);
						}
					}
				}
			}
			if (pai[scr][1] > 0 && xl[scr] > 0) {
				pai[scr][1]--;
				if (sf[i] == 2) {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				} else {
					if (pai[i][3] > 0)pai[i][3]--;
					else {
						xl[i]--;
						if (xl[i] == 0)binsi(i, scr);
					}
				}
			}
			while (pai[scr][1] > 0 && xl[scr] > 0 && zb[i] > 0) {
				pai[scr][1]--;
				if (sf[i] == 2) {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				} else {
					if (pai[i][3] > 0)pai[i][3]--;
					else {
						xl[i]--;
						if (xl[i] == 0)binsi(i, scr);
					}
				}
			}
		}
	}
}
void fpig(int scr) {
	while (xl[scr] < 4 && pai[scr][0] > 0) {
		pai[scr][0]--;
		xl[scr]++;
	}
	while (pai[scr][7] > 0) {
		pai[scr][7]--;
		zb[scr] = 1;
	}
	while (pai[scr][4] > 0) {
		pai[scr][4]--;
		nzrq(scr);
	}
	while (pai[scr][5] > 0) {
		pai[scr][5]--;
		wjqf(scr);
	}
	int flag = 0;
	for (int i = 0; i < n; i++) {
		if (jl[scr][i] == 0 || jl[scr][i] > 1)continue;
		if (gksf[i] == 2||gksf[i]==0) { //设2为忠猪
			while (pai[scr][3]) {
				pai[scr][3]--;
				if (sf[i] == 2) {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				} else {
					if (pai[i][6]) {
						pai[i][6]--;
						continue;
					}
					if (pai[i][1] > pai[scr][1]) {
						pai[i][1] -= pai[scr][1] + 1;
						pai[scr][1] = 0;
						xl[scr]--;
						if (xl[scr] == 0) {
							binsi(scr, i);
						}
					} else {
						pai[scr][1] -= pai[i][1];
						pai[scr][1] = 0;
						xl[i]--;
						if (xl[i] == 0) {
							binsi(i, scr);
						}
					}
				}
			}
			if (pai[scr][1] > 0 && xl[scr] > 0) {
				pai[scr][1]--;
				if (sf[i] == 2) {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				} else {
					if (pai[i][3] > 0)pai[i][3]--;
					else {
						xl[i]--;
						if (xl[i] == 0)binsi(i, scr);
					}
				}
			}
			while (pai[scr][1] > 0 && xl[scr] > 0 && zb[i] > 0) {
				pai[scr][1]--;
				if (sf[i] == 2) {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				} else {
					if (pai[i][3] > 0)pai[i][3]--;
					else {
						xl[i]--;
						if (xl[i] == 0)binsi(i, scr);
					}
				}
			}
		}
	}
}
void zpig(int scr) {
	while (xl[scr] < 4 && pai[scr][0] > 0) {
		pai[scr][0]--;
		xl[scr]++;
	}
	while (pai[scr][7] > 0) {
		pai[scr][7]--;
		zb[scr] = 1;
	}
	while (pai[scr][4] > 0) {
		pai[scr][4]--;
		nzrq(scr);
	}
	while (pai[scr][5] > 0) {
		pai[scr][5]--;
		wjqf(scr);
	}
	int flag = 0;
	for (int i = 0; i < n; i++) {
		if (jl[scr][i] == 0 || jl[scr][i] > 1)continue;
		if (gksf[i] == 1) { //设1为反猪或类反猪
			while (pai[scr][3]) {
				pai[scr][3]--;
				if (sf[i] == 2) {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				} else {
					if (pai[i][6]) {
						pai[i][6]--;
						continue;
					}
					if (pai[i][1] > pai[scr][1]) {
						pai[i][1] -= pai[scr][1] + 1;
						pai[scr][1] = 0;
						xl[scr]--;
						if (xl[scr] == 0) {
							binsi(scr, i);
						}
					} else {
						pai[scr][1] -= pai[i][1];
						pai[scr][1] = 0;
						xl[i]--;
						if (xl[i] == 0) {
							binsi(i, scr);
						}
					}
				}
			}
			if (pai[scr][1] > 0 && xl[scr] > 0) {
				pai[scr][1]--;
				if (sf[i] == 2) {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				} else {
					if (pai[i][3] > 0)pai[i][3]--;
					else {
						xl[i]--;
						if (xl[i] == 0)binsi(i, scr);
					}
				}
			}
			while (pai[scr][1] > 0 && xl[scr] > 0 && zb[i] > 0) {
				pai[scr][1]--;
				if (sf[i] == 2) {
					xl[i]--;
					if (xl[i] == 0)binsi(i, scr);
				} else {
					if (pai[i][3] > 0)pai[i][3]--;
					else {
						xl[i]--;
						if (xl[i] == 0)binsi(i, scr);
					}
				}
			}
		}
	}
}
int main() {
	cin >> n >> m;
	memset(pai, 0, sizeof(pai));
	memset(gksf, -1, sizeof(gksf));
	memset(zb, 0, sizeof(zb));
	for (int i = 0; i < n; i++) {
		cin >> pg;
		xl[i] = 4;
		if (pg[0] == 'M')sf[i] = 0, gksf[i] = 0, mp++; //主猪
		else if (pg[0] == 'F')sf[i] = 1, fp++; //反猪
		else sf[i] = 2; //确定猪的身份,2是忠猪
		for (int j = 0; j < 4; j++) {
			cin >> ch;
			switch (ch) {
				case 'P':
					pai[i][0]++;
					break;
				case 'K':
					pai[i][1]++;
					break;
				case 'D':
					pai[i][2]++;
					break;
				case 'F':
					pai[i][3]++;
					break;
				case 'N':
					pai[i][4]++;
					break;
				case 'W':
					pai[i][5]++;
					break;
				case 'J':
					pai[i][6]++;
					break;
				case 'Z':
					pai[i][7]++;
					break;//手牌分类
			}
		}
	}
	for (int i = 0; i < m; i++)cin >> pk[i]; //输入牌库,用队列思想模拟
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) {
			if (j == i)jl[i][j] = 0;
			else if (j > i)jl[i][j] = j - i;
			else jl[i][j] = j - i + n; //计算距离
		}
	while (isend == 0) {
		for (int i = 0; i < n; i++) {
			if (sf[i] == 0)mpig(i);
			if(sf[i]==1)fpig(i);
			else zpig(i);
		}
	}
	if(fp!=0)cout<<"ZP\n";
	else cout<<"FP\n";
	for(int i=0;i<n;i++){
		if(xl[i]==0)cout<<"DEAD\n";
		else{
			for(int j=0;j<8;j++){
				while(pai[i][j]--){
					cout<<gg[j]<<' ';
				}
			}
			cout<<'\n';
		}
	}
}

求大神帮我调一下,谢谢。

2023/1/13 20:51
加载中...