第二篇来自于这个讨论,代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 20,M = 20010,up = 4,print = 0;
string q[M];
map<string,string> mp;
map<int,string> ma,ap;
int fancnt;
int idx;
int tiao[N];
struct Player
{
string flag = "";
int f = 0;
int v = 4,cnt = 4,dis = 0,last = 0;
bool has_zhuge = 0,dead = 0;
string p[M];
}a[N];
int n,m;
void qizhi(int id,int pai)
{
if(print)
{
cout<<"id:"<<id<<" 打出了 "<<mp[a[id].p[pai]]<<endl;
}
for(int i = pai; i < a[id].cnt; i ++) a[id].p[i] = a[id].p[i + 1];
a[id].cnt --;
a[id].p[a[id].cnt + 1] = "";
}
bool do_k(int id)
{
if(a[id].f == 1)
{
if(tiao[a[id].dis] == 2 || tiao[a[id].dis] == 3) return true;
}
else if(a[id].f == 2)
{
if(tiao[a[id].dis] == 2) return true;
}
else if(a[id].f == 3)
{
if(tiao[a[id].dis] == 1) return true;
}
return false;
}
void game_over()
{
puts("FP");
for(int i = 1; i <= n; i ++)
{
if(a[i].dead)
{
puts("DEAD");
}
else
{
for(int j = 1; j <= a[i].cnt; j ++) cout<<a[i].p[j]<<" ";
puts("");
}
}
exit(0);
}
void game_win()
{
puts("MP");
for(int i = 1; i <= n; i ++)
{
if(a[i].dead)
{
puts("DEAD");
}
else
{
for(int j = 1; j <= a[i].cnt; j ++) cout<<a[i].p[j]<<" ";
puts("");
}
}
exit(0);
}
void xianyinqin(int x,int y)
{
if(tiao[y] == 1) tiao[x] = 1;
else if(tiao[y] == 2) tiao[x] = 2;
if(print) cout<<"id:"<<x<<" "<<ma[tiao[x]]<<endl;
}
void biaodiyi(int x,int y)
{
if(tiao[y] == 1) tiao[x] = 2;
else if(tiao[y] == 2) tiao[x] = 1;
if(print) cout<<"id:"<<x<<" "<<ma[tiao[x]]<<endl;
}
void check_win(int last)
{
fancnt --;
if(!fancnt) game_win();
else
{
for(int i = 1; i <= 3; i ++)
if(idx == m) a[last].p[++ a[last].cnt] = q[idx];
else a[last].p[++ a[last].cnt] = q[++ idx];
}
}
void check_die(int id)
{
if(print) cout<<"id:"<<id<<" 血量 "<<a[id].v<<endl;
if(a[id].v <= 0)
{
for(int i = 1; i <= a[id].cnt; i ++)
{
if(a[id].v <= 0 && a[id].p[i] == "P")
{
qizhi(id,i),i --,a[id].v ++;
if(print) cout<<"id:"<<id<<" 血量 "<<a[id].v<<endl;
}
}
}
if(a[id].v <= 0)
{
memset(a[id].p,0,sizeof a[id].p);
a[id].cnt = 0;
a[id].dead = 1;
a[id].has_zhuge = 0;
if(print) cout<<"id:"<<id<<"死亡了"<<endl;
tiao[id] = -1;
for(int i = 1; i <= n; i ++)
if(a[i].dis == id) a[i].dis = a[id].dis;
if(a[id].f == 1)
{
game_over();
}
else if(a[id].f == 2)
{
if(a[id].last == 1)
{
memset(a[1].p,0,sizeof a[1].p);
a[1].cnt = 0;
a[1].has_zhuge = 0;
return;
}
// for(int i = 1; i <= 3; i ++)
// if(idx == m) a[a[id].last].p[++ a[a[id].last].cnt] = q[idx];
// else a[a[id].last].p[++ a[a[id].last].cnt] = q[++ idx];
}
else if(a[id].f == 3)
{
check_win(a[id].last);
}
}
}
void shan(int from,int id)
{
for(int i = 1; i <= a[id].cnt; i ++)
{
if(a[id].p[i] == "D")
{
qizhi(id,i);
return;
}
}
a[id].v --;
a[id].last = from;
check_die(id);
}
bool wuxiekeji(int id,int good,bool f1 = 0,bool f2 = 0)
{
for(int i = 0; i < n; i ++)
{
int j = i + id;
if(j > n) j -= n;
if(a[j].dead == 1) continue;
for(int k = 1; k <= a[j].cnt; k ++)
{
if(f1)
{
if(a[j].p[k] == "J")
{
if(a[j].f == 1 && tiao[good] == 1)
{
qizhi(j,k),xianyinqin(j,good);
return !wuxiekeji(j,id,0,1);
}
else if(a[j].f == 2 && tiao[good] == 1)
{
qizhi(j,k),xianyinqin(j,good);
return !wuxiekeji(j,id,0,1);
}
else if(a[j].f == 3 && tiao[good] == 2)
{
qizhi(j,k),xianyinqin(j,good);
return !wuxiekeji(j,id,0,1);
}
}
continue;
}
if(f2)
{
if(a[j].p[k] == "J")
{
if(a[j].f == 1 && tiao[id] > 1)
{
qizhi(j,k),biaodiyi(j,id);
return !wuxiekeji(j,id,1,0);
}
else if(a[j].f == 2 && tiao[id] == 2)
{
qizhi(j,k),biaodiyi(j,id);
return !wuxiekeji(j,id,1,0);
}
else if(a[j].f == 3 && tiao[id] == 1)
{
qizhi(j,k),biaodiyi(j,id);
return !wuxiekeji(j,id,1,0);
}
}
continue;
}
if(a[j].p[k] == "J")
{
if(a[j].f == 1 && tiao[id] > 1 && tiao[good] == 1)
{
qizhi(j,k),biaodiyi(j,id),xianyinqin(j,good);
return !wuxiekeji(j,id,0);
}
else if(a[j].f == 2 && tiao[id] == 2 && tiao[good] == 1)
{
qizhi(j,k),biaodiyi(j,id),xianyinqin(j,good);
return !wuxiekeji(j,id,0);
}
else if(a[j].f == 3 && tiao[id] == 1 && tiao[good] == 2)
{
qizhi(j,k),biaodiyi(j,id),xianyinqin(j,good);
return !wuxiekeji(j,id,0);
}
}
}
}
return false;
}
bool find_sha(int id)
{
for(int i = 1; i <= a[id].cnt; i ++)
{
if(a[id].p[i] == "K")
{
qizhi(id,i);
return true;
}
}
return false;
}
void do_duel(int x,int y)
{
biaodiyi(x,y);
bool flag = wuxiekeji(x,y);
if(print) cout<<"决斗:"<<!flag<<" 目标 "<<y<<" 目标身份 "<<ma[tiao[y]]<<endl;
if(!flag)
{
if(a[x].f == 1 && a[y].f == 2)
{
a[y].v --,a[y].last = x;
check_die(y);
}
else if(a[x].f >= 1 && a[x].f <= 2 && tiao[y] == 2 || a[x].f == 3 && tiao[y] == 1)//错误标记: a[x].f >= 1 && a[x].f <= 2打成了a[x].f <= 1
{
bool tmp = 0;
while(1)
{
tmp = find_sha(y);
if(!tmp)
{
a[y].v --,a[y].last = x;
check_die(y);
break;
}
tmp = find_sha(x);
if(!tmp)
{
a[x].v --,a[x].last = y;
check_die(x);
break;
}
}
}
}
}
int duel_who;
bool duel(int id)
{
if(a[id].f == 3)
{
duel_who = 1;
return true;
}
for(int i = 1; i < n; i ++)
{
int j = i + id;
if(j > n) j -= n;
if(a[j].dead == 1) continue;
if(a[id].f == 1)
{
if(tiao[j] == 2 || tiao[j] == 3)
{
duel_who = j;
return true;
}
}
else if(a[id].f == 2)
{
if(tiao[j] == 2)
{
duel_who = j;
return true;
}
}
else if(a[id].f == 3)
{
if(tiao[j] == 1)
{
duel_who = j;
return true;
}
}
}
return false;
}
void nanzhuruqin(int id)
{
for(int i = 1; i < n; i ++)
{
int j = i + id;
if(j > n) j -= n;
if(a[j].dead == 1) continue;
bool flag = wuxiekeji(id,j,1);
if(flag) continue;
for(int k = 1; k <= a[j].cnt; k ++)
{
if(a[j].p[k] == "K")
{
qizhi(j,k);
flag = 1;
break;
}
}
if(!flag)
{
a[j].v --,a[j].last = id;
if(a[j].f == 1 && !tiao[id]) tiao[id] = 3;
check_die(j);
}
}
}
void wanjianqifa(int id)
{
for(int i = 1; i < n; i ++)
{
int j = i + id;
if(j > n) j -= n;
if(a[j].dead == 1) continue;
bool flag = wuxiekeji(id,j,1);
if(flag) continue;
for(int k = 1; k <= a[j].cnt; k ++)
{
if(a[j].p[k] == "D")
{
qizhi(j,k);
flag = 1;
break;
}
}
if(!flag)
{
a[j].v --,a[j].last = id;
if(a[j].f == 1 && !tiao[id]) tiao[id] = 3;
check_die(j);
}
}
}
void huihe(int id)
{
if(a[id].dead == 1) return;
if(idx == m) a[id].p[++ a[id].cnt] = q[idx];
else a[id].p[++ a[id].cnt] = q[++ idx];
if(idx == m) a[id].p[++ a[id].cnt] = q[idx];
else a[id].p[++ a[id].cnt] = q[++ idx];
if(print)
{
cout<<"id:"<<id<<" 表明身份 "<<ma[tiao[id]]<<" 实际身份 "<<ap[a[id].f]<<endl;
for(int i = 1; i <= a[id].cnt; i ++) cout<<mp[a[id].p[i]]<<" ";
puts("");
puts("------------------------------");
puts("");
}
bool did_k = 0;
while(1)
{
int c = 0;
for(int i = 1; i <= a[id].cnt; i ++)
{
if(a[id].p[i] == "P")
{
if(a[id].v != up)
{
a[id].v ++,qizhi(id,i),c ++;
if(print) cout<<"id:"<<id<<" 血量 "<<a[id].v<<endl;
break;
}
}
else if(a[id].p[i] == "K")
{
if(did_k && !a[id].has_zhuge) continue;
did_k = do_k(id);
if(did_k)
{
qizhi(id,i),c ++,biaodiyi(id,a[id].dis),shan(id,a[id].dis);
break;
}
}
else if(a[id].p[i] == "Z")
{
a[id].has_zhuge = 1;
qizhi(id,i);
c ++;
break;
}
else if(a[id].p[i] == "F")
{
if(duel(id))
{
qizhi(id,i),do_duel(id,duel_who),c ++;
break;
}
}
else if(a[id].p[i] == "N")
{
qizhi(id,i);
nanzhuruqin(id);
c ++;
break;
}
else if(a[id].p[i] == "W")
{
qizhi(id,i);
wanjianqifa(id);
c ++;
break;
}
}
if(!c) break;
}
if(print)
{
cout<<"id:"<<id<<" 表明身份 "<<ma[tiao[id]]<<" 实际身份 "<<ap[a[id].f]<<endl;
for(int i = 1; i <= a[id].cnt; i ++) cout<<mp[a[id].p[i]]<<" ";
puts("");
puts("------------------------------");
puts("------------------------------");
puts("");
}
}
int main()
{
if(print)
{
mp["P"] = "桃";
mp["K"] = "杀";
mp["D"] = "闪";
mp["W"] = "万箭齐发";
mp["J"] = "无懈可击";
mp["N"] = "南蛮入侵";
mp["Z"] = "诸葛连弩";
mp["F"] = "决斗";
ma[1] = "跳忠或主公";
ma[2] = "跳反";
ma[3] = "类反";
ma[0] = "未表明";
ma[-1] = "死亡";
ap[1] = "主公";
ap[2] = "忠臣";
ap[3] = "反贼";
for(int i = 1; i <= n; i ++)
{
cout<<"id:"<<i<<" 表明身份 "<<ma[tiao[i]]<<" 实际身份 "<<ap[a[i].f]<<endl;
for(int j = 1; j <= a[i].cnt; j ++) cout<<mp[a[i].p[j]]<<" ";
puts("");
puts("------------------------------");
puts("");
}
puts("");
}
cin>>n>>m;
tiao[1] = 1;
for(int i = 1; i <= n; i ++)
{
a[i].dis = i % n + 1;
cin>>a[i].flag>>a[i].p[1]>>a[i].p[2]>>a[i].p[3]>>a[i].p[4];
if(a[i].flag == "MP") a[i].f = 1;
else if(a[i].flag == "ZP") a[i].f = 2;
else if(a[i].flag == "FP") a[i].f = 3,fancnt ++;
}
for(int i = 1; i <= m; i ++) cin>>q[i];
while(1)
{
for(int i = 1; i <= n; i ++) huihe(i);
if(print) puts("__________________________");
}
return 0;
}
//及时退出出的牌
//杀人看的是跳的身份
//i,j打错
//弃置牌后i--
//对攻击可以直接无懈可击,不用下一个人开始
//无懈可击要按顺序
//打错f
hack数据是
5 5
MP Z D F J
ZP K J P Z
ZP N K W F
ZP D J W J
ZP Z F Z F
D J K K N
第一篇输出
MP
Z D F J
K J P Z
N K W F
D J W J
Z F Z F
第二篇输出
FP
DEAD
DEAD
DEAD
D N
DEAD
但这两篇都AC了,所以我想问一下,到底哪个是对的