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

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

     

     解答 

    常规BFS是会超时的  按照书上的提示 应该是打表(居然还有提倡打表的题目)

    tle 代码

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <map>
     6 
     7 using namespace std;
     8 
     9 int n, m;
    10 
    11 
    12 int bfs(const vector<int>& v)
    13 {
    14     vector<int> sorted = v;
    15     sort(sorted.begin(), sorted.end());
    16     queue<vector<int>> q;
    17     map<vector<int>, int> distance;
    18     distance[v] = 0;
    19     q.push(v);
    20     while (!q.empty()) {
    21         vector<int> here = q.front();
    22         q.pop();
    23 
    24         if (here == sorted) return distance[here];
    25         int cost = distance[here];
    26         //翻转可能的子区间
    27         for (int i = 0; i < v.size(); i++) {
    28             for (int j = i + 2; j <= v.size(); ++j) {
    29                 reverse(here.begin() + i, here.begin() + j);
    30                 if (distance.count(here) == 0) {
    31                     distance[here] = cost + 1;
    32                     q.push(here);
    33                 }
    34                 reverse(here.begin() + i, here.begin() + j);
    35             }
    36         }
    37     }
    38 
    39     return -1;
    40 }
    41 
    42 
    43 int main()
    44 {
    45     cin >> n;
    46 
    47     while (n--) {
    48         cin >> m;
    49         vector<int> v;
    50         for (int i = 0; i < m; i++) {
    51             int t;
    52             cin >> t;
    53             v.push_back(t);
    54         }
    55 
    56         cout << bfs(v) << endl;
    57     }
    58 
    59 
    60     return 0;
    61 }
    View Code

    ac代码

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <map>
     4 #include <queue>
     5 #include <vector>
     6 
     7 using namespace std;
     8 
     9 map<vector<int>, int> toSort;
    10 
    11 void precalc(int n) {
    12     vector<int> perm(n);
    13     for (int i = 0; i < n; ++i) perm[i] = i;
    14     queue<vector<int>> q;
    15     q.push(perm);
    16     toSort[perm] = 0;
    17     while (!q.empty()) {
    18         vector<int> here = q.front();
    19         q.pop();
    20         int cost = toSort[here];
    21         for (int i = 0; i < n; i++) {
    22             for (int j = i + 2; j <= n; ++j) {
    23                 reverse(here.begin() + i, here.begin() + j);
    24                 if (toSort.count(here) == 0) {
    25                     toSort[here] = cost + 1;
    26                     q.push(here);
    27                 }
    28                 reverse(here.begin() + i, here.begin() + j);
    29             }
    30         }
    31     }
    32 }
    33 
    34 int solve(const vector<int>& perm)
    35 {
    36     int n = perm.size();
    37     vector<int> fixed(n);
    38     for (int i = 0; i < n; ++i) {
    39         int smaller = 0;
    40         for (int j = 0; j < n; ++j) 
    41             if (perm[j] < perm[i])
    42                 ++smaller;
    43             fixed[i] = smaller;
    44     }
    45     return toSort[fixed];
    46 }
    47 
    48 
    49 int n, m;
    50 int main()
    51 {
    52     cin >> n;
    53     while (n--) {
    54         cin >> m;
    55         precalc(m);
    56         vector<int> perm;
    57         for (int i = 0; i < m; i++) {
    58             int t;
    59             cin >> t;
    60             perm.push_back(t);
    61         }
    62         cout << solve(perm) << endl;
    63     }
    64 
    65 
    66     return 0;
    67 }
    View Code
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    FillForm网页表单填写插件(用于火狐浏览器,自动填表,自动表单,填写表单)
    Firefox下完整读写本地文件的方法
    failure notice
    百度奖品兑换监视程序
    javascript数组及其操作(zz)
    JMETER使用
    ubuntu安装mysql
    windows live writer写csdn博客,very good~
    用SSH在linux下安装JDK和Tomcat
    java模拟HTTP请求(集合了网上搜来的各种)
  • 原文地址:https://www.cnblogs.com/itdef/p/11828567.html
Copyright © 2011-2022 走看看