zoukankan      html  css  js  c++  java
  • 算法问题实战策略 CHILDRENDAY

    地址 https://algospot.com/judge/problem/read/CHILDRENDAY

    题解

     

    ac代码

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <queue>
     4 #include <string>
     5 #include <vector>
     6 
     7 using namespace std;
     8 
     9 
    10 //当前顶点的序号为here时
    11 //经过序号为edge的边线能到达的顶点序号是多少
    12 int append(int here, int edge, int mod)
    13 {
    14     int there = here * 10 + edge;
    15     if (there >= mod) return mod + there % mod;
    16     return there % mod;
    17 }
    18 
    19 //找出仅由digits内的数组组成
    20 //且满足C mod n == m的最小的C
    21 string gifts(string digits, int n, int m)
    22 {
    23     //如果按照升序排列边线序号
    24     //就能找出按照字典顺序排在最前面的路径
    25     sort(digits.begin(),digits.end());
    26 
    27     //白色顶点i表示为0号~n-1号的顶点 灰色顶点i表示为n号~2n-1号的顶点
    28     //parent[i]=BFS生成树中顶点i的父节点
    29     //choice[i]=从parent[i]连向i的边线序号
    30     vector<int> parent(2 * n, -1), choice(2 * n, -1);
    31     queue<int> q;
    32     //将白色0号加入队列
    33     parent[0] = 0;
    34     q.push(0);
    35     while (!q.empty()) {
    36         int here = q.front();
    37         q.pop();
    38         for (int i = 0; i < digits.size(); i++) {
    39             //跟踪边线digits[i[-'0'
    40             int there = append(here, digits[i] - '0', n);
    41             if (parent[there] == -1) {
    42                 parent[there] = here;
    43                 choice[there] = digits[i] - '0';
    44                 q.push(there);
    45             }
    46         }
    47     }
    48 
    49     //未能达到灰色m号 则失败!
    50     if (parent[n + m] == -1) return "IMPOSSIBLE";
    51     //跟踪连向父节点的路径并计算C
    52     string ret;
    53     int here = n + m;
    54     while (parent[here]  != here) {
    55         ret += char('0' + choice[here]);
    56         here = parent[here];
    57     }
    58     reverse(ret.begin(), ret.end());
    59     return ret;
    60 }
    61 
    62 
    63 int main()
    64 {
    65     int n;
    66     cin >> n;
    67     while (n--) {
    68         string s;
    69         int a, b;
    70         cin >> s >> a >> b;
    71 
    72         cout << gifts(s, a, b) << endl;
    73     }
    74 }
    View Code
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Cannot execute request on any known server
    swagger快速开发
    SpringBoot(七):SpringBoot整合Swagger2
    集群、分布式
    分布式架构--基本思想汇总
    Mysql联合查询union和union all的使用介绍
    Mysql 语句执行顺序
    Spring AOP四种实现方式Demo详解与相关知识探究
    jvm运行时环境属性一览
    使用ObjectOutputStream进行socket通信的时候出现固定读到四个字节乱码的问题
  • 原文地址:https://www.cnblogs.com/itdef/p/11905644.html
Copyright © 2011-2022 走看看