Description
有一天津津和乖乖正在一起玩耍,忽然乖乖拿出了一些牌对津津说,我们来一起玩一个游戏,怎么样?津津爽快的答应了。
乖乖说:“有N张牌,记为1,2,...,N,应当怎样排放,才能使:打开第一张是1,拿出1后,然后拿两张依次放在末尾;打开上面一张,刚好是2,拿出2后,再拿两张依次放在末尾;打开上面一张,刚好是3;如此继续下去,直至打开最后一张是N。”
请问原来这些牌是怎么排列的?
Input
(a.in)n的值是大于等于0而小于等于52的.
Output
(a.out)原来这些牌的排列
Sample Input
4
Sample Output
1 3 4 2
有一天津津和乖乖正在一起玩耍,忽然乖乖拿出了一些牌对津津说,我们来一起玩一个游戏,怎么样?津津爽快的答应了。
乖乖说:“有N张牌,记为1,2,...,N,应当怎样排放,才能使:打开第一张是1,拿出1后,然后拿两张依次放在末尾;打开上面一张,刚好是2,拿出2后,再拿两张依次放在末尾;打开上面一张,刚好是3;如此继续下去,直至打开最后一张是N。”
请问原来这些牌是怎么排列的?
Input
(a.in)n的值是大于等于0而小于等于52的.
Output
(a.out)原来这些牌的排列
Sample Input
4
Sample Output
1 3 4 2
#include <stdio.h>
#define MAXNUM 1000
typedef struct {
int prev; //保存最原始的位置
int data; //保存数据
}puke;
//思路:定义一个结构体 prev表示原来的初始位置,在把牌后移动的过程中把初始位置依次传递下去
//data表示数据,最后对初始位置进行排序,输出数组
int main()
{
int i, j, location, n;
puke a[MAXNUM];
scanf("%d", &n);
if(n < 0 || n > 52)
return 0;
for(i = 0; i < n; i++)
{
a[i].prev = i + 1;
}
location = n;
for(i = 0, j = 1; j <=n; i +=3, j++)
{
a[i].data = j;
a[location].prev = a[i + 1].prev;
a[location + 1].prev = a[i + 2].prev;
location += 2;
}
a[0].prev = 1;
for(i = 1; i <=n; i++)
{
for(j = 0; j <= 3 * (n - 1); j+=3)
{
if(a[j].prev == i)
{
printf("%d ", a[j].data);
break;
}
}
}
printf("\n");
return 0;
}