题解 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:代码无论在时间还是在空间上都可以优化,我懒得写了