您的位置:首页 > 其它

poj-3087-Shuffle'm Up-模拟

2013-01-24 20:14 429 查看
题意:

给你两堆纸牌,让你通过数次洗牌动作使得洗牌之后的序列为给定序列。输出最小的洗牌次数。

洗牌方法:

把第二堆的第一张放在最下面,让后放第一堆最下面的那张,;轮流放。

洗完之后,把下面的n张作为第一堆,上面的n张作为第二堆。

做法:

模拟纸牌的放法,一步步的放,当序列符合的时候就终止放。

当纸牌的顺序和一开始的顺序相同的时候就输出-1。

注意:

注意寻找循环结。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int num[501];
int nums[501];
int num1[101];
int num2[101];
int numx[501];
int n;
int i;
int cmp(int *shu)
{
    for(i=0;i<2*n;i++)
    {
        if(nums[i]!=shu[i])return 0;
    }
    return 1;
}
void dos()
{
    int step=0;
    while(1)
    {
        step++;
        for(i=0;i<n;i++)
        {
            nums[i*2]=num2[i];
            nums[i*2+1]=num1[i];
        }
        if(cmp(num))
        {
            printf("%d\n",step);
            return ;
        }
        if(cmp(numx))
        {
            printf("-1\n");
            return  ;
        }
        for(i=0;i<n;i++)
        {
            num1[i]=nums[i];
        }
        for(i=n;i<n*2;i++)
        {
            num2[i-n]=nums[i];
        }
    }
}
int main()
{
    int t,j;
    char str;
    cin>>t;
    for(j=1;j<=t;j++)
    {
        scanf("%d%*c",&n);
        for(i=0;i<n;i++)
        {
            scanf("%c",&str);
            num1[i]=str-'A';
            numx[i]=num1[i];
        }
        getchar();
        for(i=0;i<n;i++)
        {
            scanf("%c",&str);
            num2[i]=str-'A';
            numx[i+n]=num2[i];
        }
        getchar();
        for(i=0;i<n*2;i++)
        {
            scanf("%c",&str);
            num[i]=str-'A';
        }
        printf("%d ",j);
        dos();
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: