关于我用一个题解hack了另一个题解
查看原帖
关于我用一个题解hack了另一个题解
935289
liuyinglp楼主2025/2/7 18:28

第一篇

第二篇来自于这个讨论,代码如下:

#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了,所以我想问一下,到底哪个是对的

2025/2/7 18:28
加载中...