四川大学线下编程比赛第三题:书本转移
题目详情:
小强有 3 个箱子 A,B,C 用来装书,所有的书(一共n本)都按序号由小到大的顺序堆在 A上,现在他想把所有的书全都放到 C 里面去。每次他从 A 书架拿 a 本书(不够就全拿完)到 B,A 箱子翻转,然后从 B 拿 b 本书(不够就全拿完)到 C,B 箱子翻转。然后重复操作,直到所有书都到了 C,求最后的C 里面书的顺序,详细见样例。
输入描述:
输入由多组数据构成,每组数据占一行,3 个数,n(1<=n<=10^5),a(1<=a<=10^9) , b(1<=b<=10^9),含义见题目表述。以文件结尾。
输出描述:
每组数据输出一行,首先输出数据组数,然后输出 n 个数,C 中书的排列。
答题说明:
输入样例:
4 2 1
输出样例
Case 1: 1 4 2 3
Hint
初始状态A:4321 B: 空 C:空
第一次: A->B A:21 B:34 C: 空
A 翻转 A:12 B:34 C: 空
B->C A:12 B: 4 C: 3
B 翻转 A:12 B:4 C: 3
第二次: A->B A:空 B:214 C:3
A 翻转 A:空 B:214 C:3
B->C A:空 B:14 C:23
B 翻转 A:空 B:41 C:23
第三次: B->C A:空 B:1 C:423
B 翻转 A:空 B:1 C:423
第四次: B->C A:空 B:空 C:1423
我自己的程序如下:
#include "stdio.h"
#define MAX 20
void main()
{
int bookNum,An,Bn,i,Bm,Cm,Ahead,Arear,Aflag,temp,tempBm;
int bookB[MAX],bookC[MAX];
Bm = 0,Cm = 0;
scanf("%d %d %d",&bookNum,&An,&Bn);
Ahead = bookNum,Arear = 1,Aflag = 0;
while(1)
{
if(Arear <= Ahead) //书箱A的移动,Arear表示书号的尾部(小号),Ahead
{ //代表书号的头部(大号)
for(i = 0;i < An;i++)
{
bookB[Bm++] = Aflag == 0? Ahead--:Arear++; //Aflag=0时,从书号头部取书给B箱
} //Aflag=1时,从书号尾部取书给B箱
Aflag = Aflag == 0?1:0;
}
for(i = 0;i < Bn && Bm >0;i++) //取B箱中取书给C箱
{
Bm--;
if(Bm >= 0) bookC[Cm++] = bookB[Bm];
}
tempBm = Bm;
if(tempBm > 0)
{
for(i = 0; i < Bm/2;i++) //将书箱B的书号倒序
{
tempBm--;
temp = bookB[tempBm];
bookB[tempBm] = bookB[i];
bookB[i] = temp;
}
}
if(Arear > Ahead && Bm <= 0) //如果A箱书取完且B箱书也取完,则退出循环
break;
}
for(i = Cm-1;i >= 0;i--)
printf("%d ",bookC[i]);
}
程序仅供参考,不保证完全正确,欢迎大家指正和交流!!!