欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

csp炉石传说

程序员文章站 2022-07-12 20:51:50
...

csp炉石传说
csp炉石传说
csp炉石传说

解题思路:

对于本道题目而言,给我的感觉便是比较规整,思路与逻辑也能短时间内组织起来,与元素选择器一题相比较为简单。感觉这道题目的关键处理在于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;
}
在这里插入代码片
相关标签: csp真题