牛客 哈尔滨工程大学第十四届程序设计竞赛 C-战斗步骤 (大模拟)

题目太长:(请点链接)https://ac.nowcoder.com/acm/contest/642/C

(这个题,一言难尽。。。输入样例直接复制不对(可以复制我代码里的样例),而且输出样例是错的,导致我对着错误样例改了半天,最后运行别人的正确代码并且看了最下面的样例解释才发现。。。。做这个题,前前后后花了4个小时,慢慢练吧,希望能练到在比较划算的时间里写出复杂的模拟题。)

#include <bits/stdc++.h> 
#define ll long long
using namespace std;
int a,b,c,d,e,aa,bb,cc,dd;
struct node
{
	int atk,def,xs,book,f; 
}my[10],other[10];
//book 0:没用过 1:没用过 
//xs 0:攻击形式 1:防守形式 
//f  0:没被破坏 1:被破坏 
map<string,int> mp,mp1;
string s[10],ss[10];
int vis1[10],vis2[10];
string cm;
void Init()
{
	aa=a;bb=b;cc=c;dd=d;
	mp.clear();
	mp1.clear();
	for(int i=1;i<=c;i++)
	{
		my[i].atk=my[i].def=0;
		my[i].book=1;
		my[i].f=0; 
		vis1[i]=0;			
	}
	for(int i=1;i<=d;i++)
	{
		other[i].atk=other[i].def=0;			
		other[i].book=1;
		other[i].f=0;
		vis2[i]=0;
	}	
}
void readmy()
{
		for(int i=1;i<=c;i++)
		{
			getline(cin,s[i]);
			//cout<<i<<" "<<s[i]<<endl;
			int j=0,len=s[i].size();
			while(j<len)	
			{
				if(s[i][j]=='[')
				{
					int k;
					string name="";
					for(k=j+1;s[i][k]!=']';k++)
						name+=s[i][k];
					mp[name]=i;
					j=k+1;
				}
				else if(s[i][j]=='A'&&j+1<len&&s[i][j+1]=='T')
				{
					int x=0,k;
					for(k=j+4;s[i][k]>='0'&&s[i][k]<='9';k++)
						x=x*10+s[i][k]-'0';
					my[i].atk=x;
					j=k+1;
				}
				else if(s[i][j]=='D'&&j+1<len&&s[i][j+1]=='E')
				{
					int x=0,k;
					for(k=j+4;s[i][k]>='0'&&s[i][k]<='9';k++)
						x=x*10+s[i][k]-'0';
					my[i].def=x;
					j=k+1;					
				}
				else if(s[i][j]=='A'&&j+1<len&&s[i][j+1]=='t')
				{
					my[i].xs=0;
					break;
				}
				else if(s[i][j]=='D'&&j+1<len&&s[i][j+1]=='e')
				{
					my[i].xs=1;
					break;
				}
				else
					j++;
			}	
		}	
}
void readother()
{
		for(int i=1;i<=d;i++)
		{
			getline(cin,ss[i]);
			int j=0,len=ss[i].size();
			while(j<len)	
			{
				if(ss[i][j]=='[')
				{
					int k;
					string name="";
					for(k=j+1;ss[i][k]!=']';k++)
						name+=ss[i][k];
					mp1[name]=i;
					j=k+1;
				}
				else if(ss[i][j]=='A'&&j+1<len&&ss[i][j+1]=='T')
				{
					int x=0,k;
					for(k=j+4;ss[i][k]>='0'&&ss[i][k]<='9';k++)
						x=x*10+ss[i][k]-'0';
					other[i].atk=x;
					j=k+1;
				}
				else if(ss[i][j]=='D'&&j+1<len&&ss[i][j+1]=='E')
				{
					int x=0,k;
					for(k=j+4;ss[i][k]>='0'&&ss[i][k]<='9';k++)
						x=x*10+ss[i][k]-'0';
					other[i].def=x;
					j=k+1;					
				}
				else if(ss[i][j]=='A'&&j+1<len&&ss[i][j+1]=='t')
				{
					other[i].xs=0;
					break;
				}
				else if(ss[i][j]=='D'&&j+1<len&&ss[i][j+1]=='e')
				{
					other[i].xs=1;
					break;
				}
				else
					j++;
			}	
		}	
}
int judgecm()
{
	int len=cm.size(),i,f=0;
	string c1="",c2="";
	for(i=1;i<len&&cm[i]!=']';i++)
	{
		c1+=cm[i];
	}
	for(int j=i+1;j<len;j++)
	{
		if(cm[j]=='A')
		{
			for(int k=len-2;cm[k]!='[';k--)
			{
				
				c2+=cm[k];
			}
			reverse(c2.begin(),c2.end());
			f=0;
			break;
		}
		else if(cm[j]=='D')
		{
			f=1;
			break;
		}
	}
	if(mp[c1]==0||my[mp[c1]].f)
		return 1;		
	else if(my[mp[c1]].xs==1)
		return 2;		
	else if(my[mp[c1]].book==0)
		return 3;
	else if(!f&&(mp1[c2]==0||other[mp1[c2]].f))
		return 4;	 
	if(f)
	{
		if(d>0)
		{
			return 6;
		}
		b-=my[mp[c1]].atk;	
		vis1[mp[c1]]=1;
		my[mp[c1]].book=0;	
		if(b<=0) return 5;
	}
	else
	{
		vis1[mp[c1]]=1;
		if(other[mp1[c2]].xs==0)
		{
			if(my[mp[c1]].atk==other[mp1[c2]].atk)
			{
				my[mp[c1]].book=0;
				vis1[mp[c1]]=1;
				if(my[mp[c1]].atk!=0)
				{	
					other[mp1[c2]].book=0;
					my[mp[c1]].f=1;
					other[mp1[c2]].f=1; 
					c--;
					d--;
				}
			}
			else
			{
				if(my[mp[c1]].atk<other[mp1[c2]].atk)
				{
					a-=other[mp1[c2]].atk-my[mp[c1]].atk;
					my[mp[c1]].book=0;
					if(a<=0) return 5;
					c--;	
					my[mp[c1]].f=1;
				}
				else
				{
					b-=my[mp[c1]].atk-other[mp1[c2]].atk;
					vis1[mp[c1]]=1;
					my[mp[c1]].book=0;
					if(b<=0) return 5;
					d--;
					other[mp1[c2]].f=1;
				}
			}
		}
		else 
		{
			my[mp[c1]].book=0;
			if(my[mp[c1]].atk<other[mp1[c2]].def)		
			{
				vis1[mp[c1]]=1;
				a-=other[mp1[c2]].def-my[mp[c1]].atk;
				if(a<=0) return 5;
			}
			else if(my[mp[c1]].atk>other[mp1[c2]].def)
			{
				other[mp1[c2]].book=0;
				vis1[mp[c1]]=1;
				d--;
				other[mp1[c2]].f=1;
			}
			else
			{
				vis1[mp[c1]]=1;			
			}		
		}			
	}
	return 0;	
}
void print(int r,int x)
{
	printf("Exception occurred when parsing line %d: ",r);
	if(x==1)
		printf("Your monster does not exist.");
	else if(x==2)
		printf("Your monster is in defense position.");
	else if(x==3)
		printf("Your monster has attacked already.");
	else if(x==4)
		printf("Your opponent's monster does not exist.");
	else if(x==5)
		printf("Player's life point is 0.");
	else if(x==6)
		printf("Your monster can't direct attack when your opponent controls monsters.");
	printf("\n");
} 
int main(void)
{
	while(cin>>a>>b>>c>>d)
	{
		Init();
		getchar();
		readmy();
		readother();
		int flag1=0,flag2=0;
		//flag1: 0无异常 1:有
		//flag2:1有一方为0 0:无	
		cin>>e;
		getchar(); 
		for(int i=0;i<e;i++)
		{
			getline(cin,cm);
			if(flag1||flag2) continue;
			int t=judgecm();
			if(t)
			{
				flag1=1;
				print(i,t); 
				if(t==5)
					flag2=1;
			}
		}
		if(flag1==0)
			cout<<"Finished.\n";
		printf("%d %d %d %d\n",a<0?0:a,b<0?0:b,c,d);
		for(int i=1;i<=cc;i++)
		{
			if(!my[i].f)
			{
				cout<<s[i];
				if(vis1[i])
					cout<<" Attacked";
				cout<<endl;					
			}
			
		}
		for(int i=1;i<=dd;i++)
		{
			if(!other[i].f)
				cout<<ss[i]<<endl;	
		}	
	} 
	
	return 0;	
} 
/*
8000 7000 2 1
[Dark Magician] ATK/2500 DEF/2100 AttackPosition
[Dark Magician Girl] ATK/2000 DEF/1700 DefensePosition
[Red-Eyes B. Dragon] ATK/2400 DEF/2000 AttackPosition
1
[Dark Magician] Attack [Red-Eyes B. Dragon]
2000 2000 3 3
[Dark Magician] ATK/2500 DEF/2100 AttackPosition
[Baby Dragon] ATK/1200 DEF/700 AttackPosition
[Relinquished] ATK/0 DEF/0 AttackPosition
[Elemental HERO Neos] ATK/2500 DEF/2000 AttackPosition
[Elemental HERO Flame Wingman] ATL/2100 DEF/1200 DefensePosition
[Yubel] ATK/0 DEF/0 AttackPosition
3
[Dark Magician] Attack [Elemental HERO Neos]
[Baby Dragon] Attack [Elemental HERO Flame Wingman]
[Relinquished] Attack [Yubel]
2333 6666 0 0
1
[Stardust Dragon] Attack [Number 39: Utopia]
1234 5678 1 0
[Odd-Eyes Pendulum Dragon] ATK/2500 DEF/2000 DefensePosition
1
[Odd-Eyes Pendulum Dragon] Attack [Firewall Dragon]
100 10000 1 0
[Five-Headed Dragon] ATK/5000 DEF/5000 AttackPosition
2
[Five-Headed Dragon] DirectAttack
[Five-Headed Dragon] DirectAttack
123 456 1 0
[Firewall Dragon] ATK/2500 LINK-4 AttackPosition
1
[Firewall Dragon] Attack [Odd-Eyes Pendulum Dragon]
10 1000 1 1
[Five-Headed Dragon] ATK/5000 DEF/5000 AttackPosition
[Dragon Master Knight] ATK/5000 DEF/5000 AttackPosition
2
[Five-Headed Dragon] DirectAttack
[Five-Headed Dragon] DirectAttack
8000 100 1 1
[Power Tool Dragon] ATK/2300 DEF/2500 AttackPosition
[Meklord Army of Granel] ATK/1600 DEF/1200 AttackPosition
1
[Power Tool Dragon] Attack [Meklord Army of Granel]

*/ 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值