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

 

posted @ 2017-08-16 13:11  third2333  阅读(185)  评论(0编辑  收藏  举报