洛谷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;
12 int n,t  ;
13 int s[10],len;
14
15 inline int read()
16 {
17     int x = 0 , f = 1 ;
18     char ch = getchar() ;
19     while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) f = -1 ; ch = getchar() ; }
20     while(ch>=‘0‘&&ch<=‘9‘) { x = x * 10+ch-48 ; ch = getchar() ; }
21     return x * f ;
22 }
23
24 inline void bfs()
25 {
26     while(!q.empty()) {
27         node a = q.front() ; q.pop() ;
28         int b ;
29         len = 0 ;
30         while(a.a) {
31             s[++len] = a.a % 10 ;
32             a.a/=10 ;
33         }
34         if(len==1) continue ;
35         for(int i=1;i<=len;i++) {
36             b = 0 ;
37             for(int j=len;j>=1;j--)
38                 if(i!=j)
39                     b = b*10+s[ j ] ;
40             if(!flag[b]) {
41                 flag[b] = 1 ;
42                 f[ b ] = a.ans+1 ;
43                 node p ; p.a = b ; p.ans = f[ b ] ;
44                 q.push(p) ;
45             }
46         }
47         for(int i=1;i<=len-1;i++)
48             for(int j=i+1;j<=len;j++) {
49                 swap(s[i],s[j]) ;
50                 b = 0 ;
51                 for(int k=len;k>=1;k--)
52                     b = b*10+s[k] ;
53                 if(!flag[b]) {
54                     flag[b] = 1 ;
55                     f[b] = a.ans+1 ;
56                     node p ; p.a = b ; p.ans = f[b] ;
57                     q.push(p) ;
58                 }
59                 swap(s[i],s[j]) ;
60             }
61         if(len==n) continue ;
62         for(int i=1;i<len;i++)
63             for(int j=s[i]-1;j>s[i+1];j--) {
64                 b = 0 ;
65                 for(int k = len;k > i;k--)
66                     b=b*10+s[k] ;
67                 b = b*10+j ;
68                 for(int k=i;k>=1;k--)
69                     b = b*10+s[k] ;
70                 if(!flag[b]) {
71                     flag[b] = 1 ;
72                     f[ b ] = a.ans+1 ;
73                     node p ; p.a = b ; p.ans = f[b] ;
74                     q.push(p) ;
75                 }
76             }
77     }
78 }
79
80 int main()
81 {
82     int a = read() ;
83     flag[a] = 1 ; f[a] = 0 ;
84     node p ; p.a = a ; p.ans = 0 ;
85     q.push( p ) ;
86     while(a) {
87         s[++len] = a % 10 ;
88         a/=10 ;
89     }
90     n = len ;
91     bfs() ;
92     int m = read() ;
93     while(m--) {
94         t = read() ;
95         if(flag[t]) printf("%d\n",f[ t ]) ;
96             else printf("-1\n") ;
97     }
98     return 0 ;
99 }
时间: 2024-10-05 21:45:42

洛谷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

洛谷P1126 机器人搬重物 广搜

洛谷P1126 机器人搬重物广搜 这道题其实题目不大清楚 最好配合图片 和 样例一起看 每个点如果是 1 其实管辖的是 上方的点 左边的点 以及 左上方的点 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 dx[4] = { 0,1,0,-1 } ; 6 const int dy[4] = { 1,0,-1,0 } ; 7

洛谷 P1032 字串变换 广搜

这道题原本我用深搜,结果会T,wcnm,然后就直接参考抄题解了 1 Const maxn=10000; 2 maxq=100000; 3 Var a:array[0..1,0..maxn]of string;//变换规则 4 q:array[0..1,0..maxq]of string;//两个队列 5 step:array[0..1,0..maxn]of longint;//步数 6 head,tail:array[0..1]of longint;//两个队列的头指针和尾指针 7 int,ai

洛谷P1118 数字三角形游戏

洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置.下面是一个例子:     3   1   2   4       4   3   6         7   9          16 最后得到16这样一个数字. 现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1-N的一个

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 数字生成游戏 结题报告

题目 解题思路 暴力bfs,用字符串来模拟这三种操作 用字符串的优点:代码易想,简单易懂,降低思考复杂度,删除/插入操作直接截取字符串再相加就完事了(.substr函数) 缺点:相对直接用数字操作更慢(可能只有我的慢) 交换 最简单的操作,直接交换字符串中的两个字符,然后对应到数字,判断是否要加入队列 删除 枚举删除位置,截取左右两段字符串相加得出新的字符串 插入 枚举插入位置(不能在两头),然后截取左右两段字符串,中间再加一个字符 每次记录答案时需要先将字符串转换为数字 (方法与快读的一样)

洛谷——P1179 数字统计

https://www.luogu.org/problem/show?pid=1179 题目描述 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数. 比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出 现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6 次. 输入输出格式 输入格式: 输入文件名为 two.in. 输入共 1 行,为两个正整数 L 和 R,之间用一个

洛谷 P2762 太空飞行计划问题

题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={I1,I2,…In}.实验Ej需要用到的仪器是I的子集RjÍI.配置仪器Ik的费用为ck美元.实验Ej的赞助商已同意为该实验结果支付pj美元.W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大.这里净收益是指进行实验所

洛谷 P1019 单词接龙 深搜

题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙"中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每