P1132 数字生成游戏 结题报告

题目

解题思路

暴力bfs,用字符串来模拟这三种操作

用字符串的优点:代码易想,简单易懂,降低思考复杂度,删除/插入操作直接截取字符串再相加就完事了(.substr函数)

缺点:相对直接用数字操作更慢(可能只有我的慢)

交换

最简单的操作,直接交换字符串中的两个字符,然后对应到数字,判断是否要加入队列

删除

枚举删除位置,截取左右两段字符串相加得出新的字符串

插入

枚举插入位置(不能在两头),然后截取左右两段字符串,中间再加一个字符

每次记录答案时需要先将字符串转换为数字 (方法与快读的一样)

注意

x.substr(l, r) 取得是 l —— r-1的这一段而不是 l——r(一开始不知道查了半天样例都没过)

代码

#include <bits/stdc++.h>
using namespace std;
string str, s, v = "0123456789";
int m, st[1000000], inf;
inline int get (string x) {    // get函数将字符串转换为数字
	int s(0);
	for (int i = 0; i < x.size(); i++)  s = s * 10 + x[i] - 48;
	return s;
}
void Go () {
	queue <pair<string, int> > q;
	q.push ({str, 0});
	while (q.size()) {
		pair<string, int> t = q.front();  q.pop();
		string stra = t.first;
		int len = stra.size();
		if (len == 1)  continue;    //长度为 1 时不能执行任何操作
		// 处理交换操作
		for (int i = 0; i < len; i++)
		  for (int j = i + 1; j < len; j++)  {
		  	string strb(stra);
			swap (strb[i], strb[j]);
		  	int tmp = get (strb);
		  	if (st[tmp] > t.second + 1)
			  st[tmp] = t.second + 1, q.push({strb, t.second + 1});
		  }
		// 处理删除操作
		for (int i = 0; i < len; i++) {
			string strb = stra.substr (0, i) + stra.substr (i + 1, len);
			int tmp = get (strb);
		  	if (st[tmp] > t.second + 1)
			  st[tmp] = t.second + 1, q.push({strb, t.second + 1});
		}
		// 处理插入操作
		if (len >= str.size())  continue;   // 生成数字不能超出原数字位数
		for (int i = 1; i < len; i++)
		  for (int j = stra[i-1] - 47; j < stra[i] - 48; j++) {
		    string strb = stra.substr (0, i) + v[j] + stra.substr (i, len);
			int tmp = get (strb);
		  	if (st[tmp] > t.second + 1)
			  st[tmp] = t.second + 1, q.push({strb, t.second + 1});
		  }
	}
}
int main() {
	cin >> str;
	memset (st, 0x7f, sizeof (st));  inf = st[0];
    st[get(str)] = 0;
	Go ();
	scanf ("%d", &m);
	while (m--)
	  cin >> s, printf ("%d\n", (st[get(s)] == inf) ? -1 : st[get(s)]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/whx666/p/11333597.html

时间: 2024-10-14 20:54:00

P1132 数字生成游戏 结题报告的相关文章

洛谷P1132 数字生成游戏

P1132 数字生成游戏 题目描述 小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则: 将s的任意两位对换生成新的数字,例如143可以生成314,413,134: 将s的任意一位删除生成新的数字,例如143可以生成14,13,43 在s的相邻两位之间s[i],s[i + 1]之间插入一个数字x,x需要满足s[i] < x < s[i + 1].例如143可以生成1243,1343,但是不能生成1143,1543等. 现在小明想知道,在这个生成法则下,从s

P1132 数字生成游戏

P1132 数字生成游戏 题目描述 小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则: 将s的任意两位对换生成新的数字,例如143可以生成314,413,134: 将s的任意一位删除生成新的数字,例如143可以生成14,13,43 在s的相邻两位之间s[i],s[i + 1]之间插入一个数字x,x需要满足s[i] < x < s[i + 1].例如143可以生成1243,1343,但是不能生成1143,1543等. 现在小明想知道,在这个生成法则下,从s

关于填报《国家自然科学基金资助项目结题报告》的补充说明

项目负责人在线提交<结题报告>后,只需打印系统生成的PDF版本,签字后交依托单位. 原<结题报告>撰写提纲与说明中第三项,要求随纸质结题报告提供的附件材料,在电子化后上传即可,无需再随结题报告报送纸质附件材料. <结题报告>中的摘要包括项目摘要和结题摘要两部分,其中项目摘要的内容从计划书中自动生成,结题摘要须以深入浅出的语言简明扼要地概括出项目的精华,如背景.方向.主要内容.重要结果.关键数据及其科学意义等.

《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告

<基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方案及可行性分析 题目要求:ucOS-III的移植:设计三个小实验:单一任务.多任务.并发任务. 1.设计方案 首先运行老师给的范例代码熟悉开发软件和开发板的使用:收集资料简单了解UCOSIII的基本概念,然后进行UCOSIII移植(移植到STM32f407开发板):移植成功后开始进行UCOSIII实例编程(实

初步了解--状态压缩dp---poj1185炮兵布阵结题报告

好吧,借助poj1185炮兵布阵这题,仔仔细细的了解了一下状态压缩动态规划 首先,借助题目,我们来看看状态压缩是个虾米东西..Ok follow me 一,所谓状态压缩 根据题意,我们得在长度为M 的地图上放置一些大炮(后面简称"放炮",应该不会被和谐吧),那么,首先不考虑山地,我们得把所有的放置方法都找出来,并且注意,这里只对于一行且长度为M(好吧,你可能要问考虑一行,左右互相隔2,互相不在攻击范围,那么上下呢?这里先不急,一步步来) 1,找出所有放炮的方法 假设长度为7,那么看下图

poj1185炮兵布阵结题报告--初步了解--状态压缩dp

好吧,借助poj1185炮兵布阵这题,仔仔细细的了解了一下状态压缩动态规划 首先,借助题目,我们来看看状态压缩是个虾米东西..Ok follow me 一,所谓状态压缩 根据题意,我们得在长度为M 的地图上放置一些大炮(后面简称"放炮",应该不会被和谐吧),那么,首先不考虑山地,我们得把所有的放置方法都找出来,并且注意,这里只对于一行且长度为M(好吧,你可能要问考虑一行,左右互相隔2,互相不在攻击范围,那么上下呢?这里先不急,一步步来) 1,找出所有放炮的方法 假设长度为7,那么看下图

洛谷P1132 数字生成计划 广搜

洛谷P1132 数字生成计划 广搜 三种操作 因为要步数最少,所以广搜 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const int N = 1000011 ; 6 struct node{ 7 int a,ans ; 8 }; 9 bool flag[N] ; 10 int f[N] ; 11 queue<node> q;

20155211课程设计个人结题报告

20155211课程设计个人结题报告 个人贡献 参与课设题目讨论及完成全过程 辅助调试代码 资料收集 撰写小组结题报告 实践过程中的问题及解决: 编译之后出现如下错误:..\OBJ\HZ.axf: error: L6050U: The code size of this image (47788 bytes) exceeds the maximum allowed for this version of the linker. 出现错误的原因是:没有完全破解. 解决办法是:按照D:\实验箱资料2

结题报告——2018级2016第二学期第三周作业9.24

题目一:[NOIP2002P]过河卒 描述 如图,A 点有一个过河卒,需要走到目标 B   点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例 如上图 C  点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点. 棋盘用坐标表示,A 点(0,0).B 点(n,m)(n,m 为不超过 20  的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C<>A,同