zoukankan      html  css  js  c++  java
  • 洛谷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
    ",f[ t ]) ; 
    96             else printf("-1
    ") ; 
    97     }  
    98     return 0 ; 
    99 }
  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/third2333/p/7372882.html
Copyright © 2011-2022 走看看