(挑战编程_9_2)Playing with Wheels

http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110902&format=html

#include <iostream>
#include <cstdlib>
#include <vector>
#include <set>
#include <string>
#include <cstring>
#include <fstream>
#include <cassert>
#include <cmath>
#include <iomanip>
#include <algorithm>
#include <sstream>
#include <queue>


using namespace std;

//#define _MY_DEBUG_

// 最大数
const int MAXV = 10001;

// 数位
const int NUM_LENGTH = 4;

// 一层的开始标志位
const int START_FLAG = -1;

// 一层的结束标志位
const int END_FLAG = -2;

bool discovered[MAXV];
// int parent[MAXV];



// 被禁止的数
int prevents[MAXV];
// 被禁止的数的个数
int preventNum;

// 起始数
int start;
// 终止数
int to;

// 临时保存4为整数 
int nArr[NUM_LENGTH];

/*
	MainStructure: 主结构
*/
void MainStructure();

/*
	Process
*/
void Process();

/*
	读取4位数,拼成一个整数
*/	
void ReadNum(int &num);

int bfs();

/*
	将一个4位整数的各个位放到一个一维数组中 
*/
void ParseIntToArr(int num);


/*
	将一个长度为4的一维数组转化为一个4位整数
*/
int ParseArrToInt();

/*
	判断一个数是否被阻止
*/
bool IsNumPrevent(int num);

int main()
{
	MainStructure();
	return 0;
}


void MainStructure()
{
	
#ifdef _MY_DEBUG_
	string inputStr = "C:/Users/cao/Desktop/算法/要看的书/算法/2挑战编程/input/1.inp";
	//string inputStr = "D:/2挑战编程/input/110205.inp";
	string outputStr = "C:/Users/cao/Desktop/算法/要看的书/算法/2挑战编程/input/1.outp";
	ifstream fin;
	fin.open(inputStr);		

	cin.rdbuf(fin.rdbuf());	

	/*
	ofstream fout;
	fout.open(outputStr.c_str());
	cout.rdbuf(fout.rdbuf());
	*/

#endif

	Process();
			
}
void Process()
{
	int count = 0;
	cin >> count;
	while (count--)
	{
		ReadNum(start);
		ReadNum(to);

		cin >> preventNum;
		for (int i = 0; i < preventNum; ++i)
		{
			ReadNum(prevents[i]);
		}
		if (start == to)
		{
			cout << 0 << endl;
		}
		else
		{
			cout << bfs() << endl;
		}
	}
}

int bfs()
{
	int step = -1;
	memset(discovered, 0, sizeof(discovered));
	queue<int> q;

	if (IsNumPrevent(start))
	{
		return -1;
	}

	// 一层的开始标志位
	q.push(START_FLAG);
	q.push(start);
	discovered[start] = true;

	 一层的结束标志位
	//q.push(END_FLAG);

	while (!q.empty())
	{
		int num = q.front();
		q.pop();
		// 如果是开始标志位
		if (num == START_FLAG)
		{
			if (q.size() == 0)
			{
				break;
			}
			++step;
			q.push(START_FLAG);
			continue;
		}
		 如果是结束标志位
		//if (num == END_FLAG)
		//{
		//	q.push(START_FLAG);
		//	continue;
		//}
		// 如果是结果
		if (num == to)
		{
			return step;
		}
		// 否则开始摁按钮
		ParseIntToArr(num);
		// 4个位
		for (int i = 0; i < NUM_LENGTH; ++i)
		{
			// 分别加一和减一
			for (int j = -1; j <= 1; j += 2)
			{
				nArr[i] = (nArr[i] + j + 10) % 10;
				int newNum = ParseArrToInt();
				// 如果没有被处理过
				if (!discovered[newNum])
				{					
					if (!IsNumPrevent(newNum))
					{
						discovered[newNum] = true;
						q.push(newNum);
					}
				}
				nArr[i] = (nArr[i] - j + 10) % 10;
			}
		}
	}

	return -1;
}

void ReadNum(int &num)
{
	int sum = 0;
	int tmp = 0;
	for (int i = 0; i < NUM_LENGTH; ++i)
	{
		cin >> tmp;
		sum = sum * 10 + tmp;
	}
	num = sum;
}

void ParseIntToArr(int num)
{
	memset(nArr, 0, sizeof(nArr));
	int index = 0;	
	while (num)
	{		
		nArr[index++] = num % 10;
		num /= 10;
	}
}

int ParseArrToInt()
{
	int num = 0;
	for (int i = NUM_LENGTH - 1; i >= 0; --i)
	{
		num = num * 10 + nArr[i];
	}
	return num;
}

bool IsNumPrevent(int num)
{
	for (int k = 0; k < preventNum; ++k)
	{
		if (num == prevents[k])
		{
			return true;
		}
	}
	return false;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "download wheels_custom_pack_3.3.rar"是一个下载链接,指的是下载名为"wheels_custom_pack_3.3.rar"的文件。该文件可能是一个打包的压缩文件,可能包含了与轮胎相关的定制资源或内容。 为了完成下载,你可以按照以下步骤进行: 1. 在你的设备上打开一个Web浏览器(如Chrome、Firefox等)。 2. 在浏览器的地址栏中输入下载链接,并按下回车键。 3. 等待几秒钟,直到浏览器显示准备下载文件。 4. 浏览器会弹出一个对话框,询问你是否要保存该文件。选择保存文件的位置,并点击“保存”按钮。 5. 下载过程会自动开始。可以在浏览器的下载管理器中监控下载进度。 6. 下载完成后,可以根据需要去解压缩RAR文件。大多数操作系统都有内置的解压缩工具,但如果没有,你可以下载并安装一个解压缩软件(例如WinRAR或7-Zip)。 7. 找到已下载的RAR文件,并用解压缩工具解压缩。通常,你只需右键单击该文件并选择“解压缩到当前文件夹”或类似选项即可。 8. 解压缩完成后,你可以访问解压缩后的文件夹,查看包含的轮胎定制资源或内容。 请确保下载文件的来源可信,以免因不当的下载而引发安全问题。 ### 回答2: "download wheels_custom_pack_3.3.rar" 是一条指示用户下载文件的命令。 首先,你需要打开一个可用的下载网站或与服务器进行连接。然后,在搜索栏中输入"wheels_custom_pack_3.3.rar"进行文件搜索,或进入特定网站的下载页面,搜索该文件。 找到文件后,点击下载按钮或链接,开始文件的下载过程。文件可能会以"保存"或"下载"等选项出现,选择适当的选项,将文件保存在你所需的目录中。 下载的时间取决于你的互联网连接速度和文件大小。请耐心等待,直到文件下载完成。 一旦文件下载完成,你可以在所选的目录中找到"wheels_custom_pack_3.3.rar"。点击文件或解压缩它,如果它是一个压缩文件,你可以访问其中的内容。 希望以上回答能够帮助你理解如何下载"wheels_custom_pack_3.3.rar"文件。如果有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值