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

 

转载于:https://www.cnblogs.com/third2333/p/7372882.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值