csp炉石传说
程序员文章站
2022-07-12 20:51:50
...
解题思路:
对于本道题目而言,给我的感觉便是比较规整,思路与逻辑也能短时间内组织起来,与元素选择器一题相比较为简单。感觉这道题目的关键处理在于end之后攻击互换的处理,在这里,因为只有双方,所以我们采取了异或运算进行标记。这种思想,我们在之前的题目中也遇到过,在这道题目中只有两个人,如果是多个人,应该采取加1模n的策略处理,这也是处理这类问题的一个小技巧。针对于本题,我们需要注意的是对于随从信息的时刻更新,在summon操作后针对于随从位置的更新,attack操作之后对于随从血量以及位置的更新,而对于其他方面,感觉这道题目并没有多少坑。详细见代码。
代码:
#include<iostream>
#include<string>
using namespace std;
struct Node{
int position[8];
int kill[8];
int life[8];
Node()
{
position[0]=1;
kill[0]=0;
life[0]=30;
for(int i=1;i<8;i++)
{
position[i]=0;
kill[i]=0;
life[i]=0;
}
}
};
int n;
string func;
int po,attack,li,posi1,posi2;
bool label=0;//0的时候A0做出动作,1的时候A1做出动作;
int main()
{
cin>>n;
Node A[2];
while(n--)
{
cin>>func;
if(func=="end")
{
label=label^1;
}
else if(func=="summon")
{
cin>>po>>attack>>li;
if(A[label].position[po]==0)
{
A[label].position[po]=1;
A[label].kill[po]=attack;
A[label].life[po]=li;
}
else
{
int i;
for(i=7;i>0;i--)
{
if(A[label].position[i]==1)
break;
}
for(int j=i+1;j>po;j--)
{
A[label].position[j]=1;
A[label].kill[j]=A[label].kill[j-1];
A[label].life[j]=A[label].life[j-1];
}
A[label].position[po]=1;
A[label].kill[po]=attack;
A[label].life[po]=li;
}
}
else if(func=="attack")
{
cin>>posi1>>posi2;
A[label].life[posi1]-=A[label^1].kill[posi2];
A[label^1].life[posi2]-=A[label].kill[posi1];
if(A[label^1].life[0]<=0)
break;
int i;
if(A[label].life[posi1]<=0)
{
for(i=posi1+1;i<=7;i++)
{
if(A[label].position[i]==1)
{
A[label].position[i-1]=1;
A[label].kill[i-1]=A[label].kill[i];
A[label].life[i-1]=A[label].life[i];
}
else break;
}
A[label].position[i-1]=0;
A[label].life[i-1]=0;
A[label].kill[i-1]=0;
}
if(A[label^1].life[posi2]<=0)
{
for(i=posi2+1;i<=7;i++)
{
if(A[label^1].position[i]==1)
{
A[label^1].position[i-1]=1;
A[label^1].kill[i-1]=A[label^1].kill[i];
A[label^1].life[i-1]=A[label^1].life[i];
}
else break;
}
A[label^1].position[i-1]=0;
A[label^1].life[i-1]=0;
A[label^1].kill[i-1]=0;
}
}
}
if(A[0].life[0]>0&&A[1].life[0]>0)
cout<<0<<endl;
else if(A[0].life[0]>0&&A[1].life[0]<=0)
cout<<1<<endl;
else if(A[0].life[0]<=0&&A[1].life[0]>0)
cout<<-1<<endl;
cout<<A[0].life[0]<<endl;
int t1=0,t2=0;
for(int i=1;i<=7;i++)
{
if(A[0].position[i]==1)
t1++;
else
break;
}
cout<<t1<<" ";
for(int i=1;i<t1;i++)
{
cout<<A[0].life[i]<<" ";
}
if(t1!=0)
cout<<A[0].life[t1]<<endl;
else
cout<<endl;
cout<<A[1].life[0]<<endl;
for(int i=1;i<=7;i++)
{
if(A[1].position[i]==1)
t2++;
else
break;
}
cout<<t2<<" ";
for(int i=1;i<t2;i++)
{
cout<<A[1].life[i]<<" ";
}
if(t2!=0)
cout<<A[1].life[t2]<<endl;
else
cout<<endl;
}
在这里插入代码片
上一篇: 查找wife密码