题目分析:将52张牌,摞在一起,每次操作,将从上到下的第L到R(1<=L<=R<=52)张放到最上面,N次操作后,输出从上个到下牌的顺序,,,
思路:很明显的规律题,找出周期即可,,,用函数fun()来模拟操作过程,用Is_Equal()检查是否和原来的一样,从而周初周期T,之后再调用N%T次fun()就可以了
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int arr[100],arr1[100];
int N,L,R,T;
void fun()
{
int a[100];
for(int i=1;i<L;i++)
a[i]=arr[i];
int temp=0;
for(int i=1;i<=R-L+1;i++)
arr[i]=arr[L+temp++];
temp=1;
for(int i=1;i<L;i++)
arr[R-L+1+temp++]=a[i];
}
bool Is_Equal()
{
for(int i=1;i<=R;i++)
if(arr[i]!=arr1[i])
return false;
return true;
}
int main()
{
int ca;
scanf("%d",&ca);
for(int t=1;t<=ca;t++)
{
for(int i=1;i<=52;i++)
{
scanf("%d",&arr[i]);
arr1[i]=arr[i];
}
scanf("%d %d %d",&N,&L,&R);
T=0;
while(1)
{
T++;
fun();
if(Is_Equal())
{
break;
}
}
//printf("T==%d\n\n",T);
int temp=N%T;
for(int i=1;i<=temp;i++)
fun();
printf("Case #%d:",t);//是t不是ca WA了一次
for(int i=1;i<=52;i++)
printf(" %d",arr[i]);
printf("\n");
}
system("pause");
return 0;
}