洛谷P1132 数字生成计划 广搜

Posted third2333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷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 }

 

以上是关于洛谷P1132 数字生成计划 广搜的主要内容,如果未能解决你的问题,请参考以下文章

P1132 数字生成游戏

P1132 数字生成游戏 结题报告

P1132 数字生成游戏

洛谷P1126 机器人搬重物 广搜

洛谷 P1032 字串变换 广搜

洛谷P2667 超级质数 [2017年6月计划 数论05]