poj 3032
拿五张牌做例子吧,根据题意刻画出如下图形(‘*’代表未知牌)
* 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; }