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;
}

转载于:https://www.cnblogs.com/yu-chao/archive/2011/09/13/2174709.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值