题解 P2348 【三国杀I(洗牌&发牌)】
不要被题目吓到了
只是很普通的模拟,题目怎么讲就怎么做
进一步解释都在注释上了
#include<cstdio>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
const int MAXN=100005;
struct Node
{//用string类型,避免了空格回车的麻烦(虽然速度会慢一些)
string c;//ColorNumber
string t;//Type
}a[MAXN],b[MAXN],ans[10];
int main()
{
freopen("三国杀I(洗牌&发牌).in","r",stdin);
freopen("三国杀I(洗牌&发牌).out","w",stdout);
int n,k,m,p;
scanf("%d%d%d%d",&n,&k,&m,&p);
if(k<n*4)//牌不够
{
printf("Error:cards not enough");
return 0;
}
k=k/2*2;//利用下取整解决:可以有奇数张牌,最后一张牌将被无耻的度娘吃掉
for(int i=1;i<=k;i++)
{
cin>>a[i].c;
cin>>a[i].t;
}
while(m--)
{//洗牌方式:k/2+1,1,k/2+2,2,k/2+3,3, ... ,k,k/2
int j=1;
for(int i=1;i<=k-1;i+=2,j++)
{
b[i]=a[k/2+j];
b[i+1]=a[j];
}//重新存回a数组
for(int i=1;i<=k;i++)
a[i]=b[i];
}
int j=1;
//发牌方式:从第1张牌开始,第i张牌给第(i-1)%n+1个人
for(int i=1;i<=k&&j<5;i++)
if((i-1)%n+1==p)
{//保存答案
ans[j]=a[i];
j++;
}
for(int i=1;i<=4;i++)
cout<<ans[i].c<<' '<<ans[i].t<<endl;
return 0;
}
PS:代码无论在时间还是在空间上都可以优化,我懒得写了