题目太长:(请点链接)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]
*/