• 洛谷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 }
  • 相关阅读:
    sklearn学习笔记
    概率生成模型GAN
    机器学习的种类
    如何为React提交pull request
    webpack define Plugin
    Saas应用方法论12条
    React Ref 和 React forwardRef
    几个数组去重的方法
    级数笔记
    信号量及P/V操作
  • 原文地址:https://www.cnblogs.com/third2333/p/7372882.html
Copyright © 2020-2023  润新知