洛谷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 ",f[ t ]) ; 96 else printf("-1 ") ; 97 } 98 return 0 ; 99 }