纸牌问题求解
张三手拿13张迭在一起的黑桃牌,牌面朝下,对众人说:我不看牌,只数数就可以猜到每张牌是什么。说罢,张三将最上面的那张牌数为1,把它翻过来正好是黑桃A,将黑桃A放在桌子上,然后按顺序从上到下数手上的余牌,第二次数1、2,将第一张牌放在这迭牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3。这样依次进行将13张牌全翻出来,准确无误。问张三手中的牌原始顺序是怎样安排的?请编程实现。、
# include <stdio.h>
# define N 13
int main(void)
{
int i, j=0, n;
int a[N] = {0};
for(i = 0; i < N-1; i++)
{
for(n = 1; n <= i; n++)
{
if(j > N-1)
{
j = 0;
}
if(a[j])
{
j++;
}
else
{
if(n == i)
a[j] = i;
j++;
}
}
}
for(i = 0; i <= N-1; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
得出的结果是
1 5 2 0 0 3 0 6 0 4 0 0 0
求解哪里错了啊~谢了~ 纸牌问题 求解
[解决办法]
这个问题其实就是一个递归……你的我还没明白
#include<iostream>
using namespace std;
/*举个例子:
假如要排序1..13
因为各一张出牌,所以最先只能出一半,故而当前问题解就是 1 x1 2 x2 3 x3 4 x4 5 x5 6 x6 7
现在考虑子问题,即8~13这六张牌的次序(x1~x6)
显然要正确出牌,那么出完七张牌后8...13的序列应该是 8 y1 9 y2 10 y3 (暂时不考虑子问题11~13这3张牌的次序(y1~y3),因为这是递归的)
因为出1~7这7张牌时,x1~x6相当于被向右循环移动了7次,故而应当对子规模的 8 y1 9 y2 10 y3 (x1~x6) 向左循环移动7次
注:此处优化是,当前规模问题n半分后:
当n为奇数,前半段n/2+1,后半段n/2(如13划分为7+6),后半段做循环移动n/2+1就相当于与循环1次
当n为偶数,前半段与后半段都为n/2,故而后半段做循环移动n/2相当于没动
*/
void rool(int *seq,int l,int r,int h)
{
if(h!=(r-l+1))
{
int temp=seq[l];
for(int i=l;i<r;i++) seq[i]=seq[i+1];
seq[r]=temp;
}
}
void insert(int*seq,int l,int r)
{
int i,j,n=r-l+1;
int* temp=(int*)malloc(n*sizeof(int));
for(i=0,j=0;i<n;i+=2,j++) temp[i]=seq[l+j];
for(i=1;i<n;i+=2,j++) temp[i]=seq[l+j];
for(i=0;i<n;i++) seq[l+i]=temp[i];
free(temp);
}
void sort(int* seq,int l,int r)
{
if(l==r) return;
else
{
int mid=(l+r)/2;
sort(seq,mid+1,r);//排序后半段
rool(seq,mid+1,r,mid-l+1);//倒转后半段
insert(seq,l,r);//将后半段插入前半段
}
}
int main(int argc,char* argv[])
{
int i,n,*seq;
while(1)
{
cin>>n;
seq=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++) seq[i]=i+1;
sort(seq,0,n-1);
for(i=0;i<n;i++) cout<<seq[i]<<' ';
cout<<endl;
}
return 0;
}
[解决办法]
我的思路和你的一样,程序如下:
#include <stdio.h>
int main()
{
int times = 0;//数牌的次数
int pos = 0;//目前的位置
int cards[13]={0};
for (int n = 0;n<13;n++)
{
for (times = 0; times <= n; pos++)
{
if (pos == 13)
{
pos = 0;
}
if (cards[pos] == 0)
{
times++;
}
}
pos--;
cards[pos] = times;
}
for (int times =0;times<13;times++)
{
printf("第%d张牌:%d \n",times+1,cards[times]);
}
printf("\n");
return 0;
}
得出的牌序是:1 8 2 5 10 3 12 11 9 4 7 6 13。