我用了骗分做法,手牌没有从左往右存,但是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';
}
}
}
求大神帮我调一下,谢谢。