簿传输

1. 问题

小强有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

2. 參考代码

#include <iostream>
using namespace std;

class CBook
{
public:
	int *Abox, *Bbox, *Cbox;
	int num, aMoveBook, bMoveBook;
	CBook(int bookNum, int a, int b);
	~CBook();
	void setup();
	void init();
	void getABox();
	void getBBox();
	void reverse(int *box, int num);
	void outPutCase();
	bool isEmpty();
	void operator=(CBook bookSource)
	{
		memcpy(Abox, bookSource.Abox, (num+1) * sizeof(int));
		memcpy(Bbox, bookSource.Bbox, (num+1) * sizeof(int));
		memcpy(Cbox, bookSource.Cbox, (num+1) * sizeof(int));
	}
};

void setup(CBook book);
int main()
{
	CBook bookMove(8, 5, 3);
	bookMove.init();
	setup(bookMove);
	return 1;
}
CBook::CBook(int bookNum, int a, int b)
{
	Abox = new int[bookNum + 1];
	Bbox = new int[bookNum + 1];
	Cbox = new int[bookNum + 1];
	num = bookNum;
	aMoveBook = a;
	bMoveBook = b;
}
CBook::~CBook()
{
}

void CBook::init()
{
	int temp = num;
	Abox[0] = num;
	Bbox[0] = 0;
	Cbox[0] = 0;
	int i = 1;
	while (temp)
	{
		Abox[temp--] = i++;
	}
}

void CBook::getABox()
{
	//Abox is empty
	if (Abox[0] == 0)
	{
		return;
	}
	if (Abox[0] < aMoveBook)
	{
		int tail = Bbox[0];
		//bbox's book move back
		while (tail)
		{
			Bbox[tail + Abox[0]] = Bbox[tail--];
		}
		tail = Abox[0];
		for (int i=0; i<Abox[0]; ++i)
		{
			Bbox[tail--] = Abox[i+1];
		}
		Bbox[0] += Abox[0];
		Abox[0] = 0;
	}
	else
	{
		int tail = Bbox[0];
		//bbox's book move back
		while (tail)
		{
			Bbox[tail + aMoveBook] = Bbox[tail--];
		}

		tail = aMoveBook;
		for (int i=0; i<aMoveBook; ++i)
		{
			Bbox[tail--] = Abox[i+1];
		}
		Bbox[0] += aMoveBook;
		reverse(Abox, aMoveBook);
	}
}

void CBook::getBBox()
{
	//Bbox is empty
	if (Bbox[0] == 0)
	{
		return;
	}
	if (Bbox[0] < bMoveBook)
	{
		int tail = Cbox[0];
		//Cbox's book move back
		while (tail)
		{
			Cbox[tail + Bbox[0]] = Cbox[tail--];
		}
		tail = Bbox[0];
		for (int i=0; i<Bbox[0]; ++i)
		{
			Cbox[tail--] = Bbox[i+1];
		}
		Cbox[0] += Bbox[0];
		Bbox[0] = 0;
	}
	else
	{
		//Cbox's book move back
		int tail = Cbox[0];
		while (tail)
		{
			Cbox[tail + bMoveBook] = Cbox[tail--];
		}
		tail = bMoveBook;

		for (int i=0; i<bMoveBook; ++i)
		{
			Cbox[tail--] = Bbox[i+1];
		}
		Cbox[0] += bMoveBook;
		reverse(Bbox, bMoveBook);
	}

}

void CBook::reverse(int *book, int num)
{
	int tail = book[0];
	int changeNum = -1;
	for (int i=1; i<=num; ++i)
	{
		book[i] = book[tail--];
	}
	int head = num + 1;
	while (head < tail)
	{
		changeNum = book[head];
		book[head++] = book[tail];
		book[tail--] = changeNum;
	}
	book[0] -= num;
}

void CBook::outPutCase()
{
	if (Cbox[0] == num)
	{
		for (int i=1; i<=num; ++i)
		{
			cout<<Cbox[i]<<" ";
		}
		cout<<endl;
	}
}

bool CBook::isEmpty()
{
	return Cbox[0] == num;
}

void setup(CBook book)
{
	if (book.isEmpty())
	{
		return;
	}
	//case1
	//get book from A
	//output
	CBook temp(book.num, book.aMoveBook, book.bMoveBook);
	temp = book;
	if (book.Abox[0] > 0)
	{
		book.getABox();
		book.outPutCase();
		setup(book);
	}

	//case2
	//get book from B
	//output
	book = temp;
	if (book.Bbox[0] > 0)
	{
		book.getBBox();
		book.outPutCase();
		setup(book);
	}

}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-12 14:44:19

簿传输的相关文章

在四川大学的第三个冠军在线编程竞赛:簿传输

好久没有写日志,奇怪的是很特别的更近,最近参加的编程方面是CSDN在学院俱乐部的在线编程插头.说到编程大赛.一共有三个问题.标题都能够csdn学院看到俱乐部.比赛有点紧张时,,第三个问题涉及到队列,提示,坑...也怨自己平时写代码用惯了代码提示,非常多stl的方法都是隐隐约约知道,可是详细的不知道,导致第三题没有做出来,遗憾哈!以下贴一下今天写的第三题的代码 题目 四川大学线下编程比赛第三题:书本转移 题目详情: 小强有 3 个箱子 A,B,C 用来装书,全部的书(一共n本)都按序号由小到大的顺

剪贴簿

剪贴簿 壹佰软件开发小组  整理编译   Microsoft Windows剪贴簿允许把数据从一个程序传送到另一个程序中.它的原理相对而言比较简单,把数据存放到剪贴簿上的程序或从剪贴簿上取出数据的程序都无须太多的负担.Windows 98和Microsoft Windows NT都提供了剪贴簿浏览程序,该程序可以显示剪贴簿的目前内容. 许多处理文件或者其它数据的程序都包含一个「Edit」菜单,其中包括「Cut」.「Copy」和「Paste」选项.当使用者选择「Cut」或者「Copy」时,程序将数

[Lync]lync同步通讯簿

概述 在客户现场部署lync的时候,突然发现新安装的lync客户端,搜索联系人功能无法使用,而将lync客户端安装后,隔一段时间后,又可以查询了,发现可能是数据没有同步的原因. 解决方案 客户端地址簿同步时间 当你登录Lync客户端时,客户端需要1-60分钟从服务器ABS下载GalContact.db和GalContacts.db.idx这两个地址簿文件. 所以此时你将无法使用模糊查询,当你查询‘-’时,客户端会提示你说地址簿正在同步. 我们可以通过修改注册表,让客户端马上下载GalContac

如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据

本文分步介绍了多种从 Microsoft Visual C# 2005 或 Microsoft Visual C# .NET 程序向 Microsoft Excel 2002 传输数据的方法.本文还提供了每种方法的优点和缺点,以便您可以选择最适合您的情况的解决方案. 概述 最常用于向 Excel 工作簿传输数据的方法是"自动化".利用"自动化"功能,您可以调用特定于 Excel 任务的方法和属性."自动化"功能为您提供了指定数据在工作簿中所处的位

Exchange 2013多租户托管PART 5:配置通讯簿策略

又有一段时间没有写东西了,今天给大家带来的是基于通讯簿策略来为不同租户分配相对应的通讯簿,包括脱机地址列表等. 首先,我们需要安装通讯簿策略路由传输助理,可以通过Exchange Management Shell来完成: Install-TransportAgent -Name "ABP Routing Agent" -TransportAgentFactory "Microsoft.Exchange.Transport.Agent.AddressBookPolicyRout

数据包传输的全过程

第一个 什么是FTP? FTP是英文File Transfer Protocol的缩写,意思是文件传输协议.它和HTTP一样都是Internet上广泛使用的协议,用来在两台计算机之间互相传送文件.相比于HTTP,FTP协议要复杂得多.复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令:另一个是数据链路,用来上传或下载数据. FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式. PORT(主动)方式的连接过程是:客户

carchive网络传输二进制文件I6B

网络传输二进制文件,如果你对二进制文件的读写不懂,网络上传输二进制文件更不懂,这里包括音频,视频文件,图片文件等.研读这个例子是不错的选择,网络传输多个二进制文件.下载下来后可直接运行,测试通过的.点载下载下载地地:由<网络通信编程实用案例精选>配套源码改写而来,原先的例子只能传文本文件. http://weibo.com/p20180109p/1001604189534500829644邮本窗MXW味2D胺叹叹掩 http://weibo.com/p20180109p/10016041910

微信文件传输助手文件夹在哪?一起来找找

微信文件传输助手是微信电脑版与手机微信之间相互传输图片等文件的好工具,但很多童鞋都找不到微信文件传输助手文件夹在哪,就让我们一起找找吧 1.先说说手机微信文件传输助手文件夹在哪吧 文件夹路径为/Tencent/MicroMsg/Download/ 2.电脑版微信文件传输助手文件夹在:/微信安装保存目录/wechat files/微信号/ 也可以点击接收到的图片下载保存到相应位置即可

笔记:Jersey REST 传输格式

通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型.文件.流等格式. 基本类型 Java的基本类型又叫原生类型,包括4种整数(byte.short.int.long).2种浮点类型(float.double).Unicode编码的字符(char)和布尔类型(boolean),Jersey 支持全部的基本类型,还支持与之相关的引用类型,示例代码如下: REST 服务代码 @POST @Path("b") public String