拿五张牌做例子吧,根据题意刻画出如下图形(‘*’代表未知牌)
* 1 (1前面有1张未知牌)
* * 2 ( 2前面有2张未知牌)
* * * 3 (3前面有3张未知牌)
* * * * 4 (4前面有4张未知牌)
* * * * * 5 (5前面有5张未知牌)
我们把它写成一个序列:
* 1 * * 2 * * * 3 * * * * 4 * * * * * * 5
我们找前5个作为放牌的5个位置,显然1和2的位置确定。
* 1 * * 2
把后面的序列中的前3个* * *填充到前面的3个未知牌 :
* 1 * * 2
接着把后面的3个3 * * 填充到前面的三个未知牌,这时3被确定
3 1 * * 2
接着把后面的序列前两个* * 填充到前面的2个未知牌中:
3 1 * * 2
然后再把后面序列中的前两个4 * 填充到前面的2个未知牌中,这时4被确定:
3 1 4 * 2
以此类推:
.
.
.
最后得:
3 1 4 5 2
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int i,j,m,n,p;
int a[14];
scanf("%d",&n);
while(n--)
{
memset(a,0,sizeof(a));
scanf("%d",&m);
for(p=i=0;i<m;a[p-1]=++i)//m个牌m个位置,每次循环确定i牌的位置为a[p-1]
for(j=0;j<=i+1;)//因为i从0开始所以要找(i+2)个空位
{
p%=m;
if(a[p++]==0) j++;//找到空位
}
for(i=0;i<m-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[m-1]);
}
return 0;
}