poj 3032

拿五张牌做例子吧,根据题意刻画出如下图形(‘*’代表未知牌)

* 1            (1前面有1张未知牌)

* * 2          ( 2前面有2张未知牌)

* * * 3         (3前面有3张未知牌)

* * * * 4        (4前面有4张未知牌)

* * * * * 5      (5前面有5张未知牌)

我们把它写成一个序列:

* 1 * * 2 * * * 3 * * * * 4 * * * * * * 5

我们找前5个作为放牌的5个位置,显然12的位置确定。

* 1 * * 2 

把后面的序列中的前3* * *填充到前面的3个未知牌

* 1 * * 2

接着把后面的33 * * 填充到前面的三个未知牌,这时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;
}

posted @ 2011-09-13 14:46  书山有路,学海无涯  阅读(347)  评论(0编辑  收藏  举报