青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-14  評論-8  文章-0  trackbacks-0

     題目及解題程序給在末尾,先來看看排列一個數組的方法。

     給定一個數組 array[] = {3, 1, 2, 4, 0}; 這個給定的數組有目的性,即它符合 n * m 的規則,這里是 5 * 5(5個元素,5個連續且不同的值)。按我想到的一般的方法,就是使用循環來求出各種排列的可能,但這種方法不能確保每個元素只出現一次,且隨著元素個數的增長,循環深度將變得很深。繼續想下去,這種方法將會變得很復雜,這就要求我尋找另外一種方法。注意到每個元素并不相同,那么要使各個元素在每個位置上只出現一次,很明顯的一種方法就是“彩票機讀票法”。比如數據讀入口在第一個元素的位置,那么依次循環這個數組,每次使后面的元素向前移動一位,各個數字不就都讀到了嗎,這就像在打印機中滾動的紙。具體步驟如下:

31240
12403 <—rotate

     第一位如此,那么后面的每一位也如此,也就是遞歸地處理后面的數字,每移動一位就以下一位為起點做相同的處理,直到所有數字循環了一遍,那排列的工作也就完成了。一個具體的實現如下:

/*
 * @param r:     需要求其排列的向量
 * @param iPos:  當前所進行到的位置
 * 程序體中的注釋表示處于那個位置的向量都是一個新的且唯一的排列
*/
void rotate(vector<int>& r, int iPos) {

    if(iPos == r.size() - 1)//是否循環完畢,調用函數時 iPos 置0
        return;

    int iNextPos = iPos + 1;
    for(size_t i = iPos; i < r.size(); ++i) {
        if(i == 0) {
            //a different permutation, do something here
        }

        int t = r[iPos];
        for(size_t j = iPos; j < r.size() - 1; ++j)//循環前移
            r[j] = r[j + 1];
        r[r.size() - 1] = t;

        if(i != r.size() - 1) {
            //a different permutation, do something here
        }

        rotate(r, iNextPos);//從下一位數字開始新的位移
    }
}
   這種方法不要求數字式連續的,也不用事先規定好向量的長度。只是當向量長度到了一定的時候,運算時間會很長!其它方法未知……
   topcoder 上的練習題如下:

Problem Statement

A permutation A[0], A[1], ..., A[N-1] is a sequence containing each integer between 0 and N-1, inclusive, exactly once. Each permutation A of length N has a corresponding child array B of the same length, where B is defined as follows:
B[0] = 0
B[i] = A[B[i-1]], for every i between 1 and N-1, inclusive.
A permutation is considered perfect if its child array is also a permutation.  Below are given all permutations for N=3 with their child arrays. Note that for two of these permutations ({1, 2, 0} and {2, 0, 1}) the child array is also a permutation, so these two permutations are perfect.
Permutation        Child array
{0, 1, 2}        {0, 0, 0}
{0, 2, 1}        {0, 0, 0}
{1, 0, 2}        {0, 1, 0}
{1, 2, 0}        {0, 1, 2}
{2, 0, 1}        {0, 2, 1}
{2, 1, 0}        {0, 2, 0}
You are given a vector <int> P containing a permutation of length N. Find a perfect permutation Q of the same length such that the difference between P and Q is as small as possible, and return this difference. The difference between P and Q is the number of indices i for which P[i] and Q[i] are different.
Definition

Class:
PerfectPermutation
Method:
reorder
Parameters:
vector <int>
Returns:
int
Method signature:
int reorder(vector <int> P)
(be sure your method is public)

Constraints
-
P will contain between 1 and 50 elements, inclusive.
-
P will contain each integer between 0 and N-1, inclusive, exactly once, where N is the number of elements in P.
Examples

0)
{2, 0, 1}
Returns: 0
P is a perfect permutation, so we can use the same permutation for Q. The difference is then 0 because P and Q are the same.

1)
{2, 0, 1, 4, 3}
Returns: 2
Q might be {2, 0, 3, 4, 1}.

2)
{2, 3, 0, 1}
Returns: 2
Q might be {1, 3, 0, 2}.

3)
{0, 5, 3, 2, 1, 4}
Returns: 3

4)
{4, 2, 6, 0, 3, 5, 9, 7, 8, 1}
Returns: 5

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.

    我的解答如下:
#include <iostream>
#include <vector>
#include <cstddef>
#include <limits>
#include <cassert>

#include <boost\assign.hpp>    // for vector +=

using namespace std;

class PerfectPermutation {
public:
    int  reorder(const vector<int>& P, vector<int>& result);
    bool isPerfect(const vector<int>& P);

private:
    int  difference(const vector<int>& P, const vector<int>& Q);
    void rotate(const vector<int>& src, vector<int>& r, int level, int& nMin, vector<int>& out);
};

int PerfectPermutation::difference(const vector<int>& P, const vector<int>& Q) {

    size_t cDiff = P.size();
    assert(cDiff == Q.size());

    for(size_t i = 0; i < P.size(); ++i) {
        if(P[i] == Q[i])
            cDiff--;
    }

    return cDiff;
}

bool PerfectPermutation::isPerfect(const vector<int>& A) {

    int Bi = 0, Bi_1 = 0;
    vector<bool> vb(A.size());
    vb[0] = true;

    for(size_t i = 1; i < A.size(); ++i) {
        if(vb[Bi = A[Bi_1]])
            return false;
        else
            vb[Bi] = true;

        Bi_1 = Bi;
    }

    return true;
}

void PerfectPermutation::rotate(const vector<int>& src, vector<int>& r, int level, int& nMin, vector<int>& out) {

    if(level == r.size() - 1)
        return;

    int in = level + 1;
    for(size_t i = level; i < r.size(); ++i) {
        if(i == 0 && isPerfect(r)) {
            nMin = min(difference(src, r), nMin);
            out = r;
        }

        int t = r[level];
        for(size_t j = level; j < r.size() - 1; ++j)
            r[j] = r[j + 1];
        r[r.size() - 1] = t;

        if((i != r.size() - 1) && isPerfect(r)) {
            nMin = min(difference(src, r), nMin);
            out = r;
        }

        rotate(src, r, in, nMin, out);
    }
}

int PerfectPermutation::reorder(const vector<int>& P, vector<int>& result) {

    if(P.size() == 1 || isPerfect(P))
        return 0;

    int nMin = numeric_limits<int>::max();

    vector<int> Q(P);

    rotate(P, Q, 0, nMin, result);

    return nMin == numeric_limits<int>::max() ? -1 : nMin;
}
int main() {

    using namespace boost::assign;

    PerfectPermutation pp;

    vector<int> P;
    P += 2, 0, 1, 4, 3;
    vector<int> result(P.size());

    cout << "Is a perfect Permutation :                    " << (pp.isPerfect(P) ? "Yes" : "No") << endl;
    cout << "Difference between before reorder and after : " << pp.reorder(P, result) << endl;
    assert(pp.isPerfect(result));
    cout << "One answer might be :                         ";
    for(size_t i = 0; i < result.size(); ++i)
        cout << result[i] << " ";
    cout << endl;

    return 0;
}
posted on 2009-12-19 20:53 崇文 閱讀(2083) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩在线一区二区| 亚洲福利视频专区| 欧美主播一区二区三区美女 久久精品人| 亚洲欧美日韩一区二区三区在线观看| 欧美在线观看视频一区二区三区| 欧美国产日韩在线| 亚洲国产美国国产综合一区二区| 久久精品2019中文字幕| 亚洲国产精品一区二区第一页| 国产午夜精品一区理论片飘花| 欧美日韩国产小视频在线观看| 一区在线电影| 久久精品青青大伊人av| 亚洲男人第一av网站| 欧美日韩高清在线| 日韩视频一区二区| 亚洲黄色一区二区三区| 欧美插天视频在线播放| 亚洲国产小视频在线观看| 免费日韩一区二区| 久久久久五月天| 亚洲国产精品欧美一二99| 欧美激情视频一区二区三区免费| 麻豆国产精品va在线观看不卡| 在线看一区二区| 亚洲国产精品一区二区三区| 久久人人97超碰精品888| 在线观看日韩| 最近看过的日韩成人| 欧美日韩亚洲综合一区| 亚洲自拍偷拍一区| 亚洲综合激情| 在线成人av网站| 亚洲大片精品永久免费| 亚洲欧美视频一区| 欧美一级片久久久久久久| 国产自产女人91一区在线观看| 久久综合给合久久狠狠色 | 亚洲久色影视| 国产精品久久久久久影视| 久久精品国产成人| 免费观看不卡av| 亚洲一区久久| 久久婷婷人人澡人人喊人人爽| 亚洲精品在线观| 亚洲在线观看| 亚洲国产毛片完整版 | 欧美日韩在线精品一区二区三区| 亚洲欧美中文在线视频| 久久久久看片| 亚洲综合视频网| 老司机午夜精品视频在线观看| 日韩一区二区精品葵司在线| 亚洲欧洲一二三| 一区二区精品在线| 午夜亚洲福利| 日韩小视频在线观看专区| 亚洲免费影院| 日韩一本二本av| 久久久激情视频| 亚洲一区精品在线| 免费观看在线综合色| 欧美呦呦网站| 欧美性理论片在线观看片免费| 免费成人在线视频网站| 国产精品色在线| 亚洲精品婷婷| 亚洲国产一区二区视频| 欧美一区二区免费| 香蕉成人久久| 欧美午夜激情小视频| 亚洲国内在线| 亚洲国产精品福利| 欧美专区18| 久久riav二区三区| 国产精品swag| 亚洲国产一区视频| 亚洲国产岛国毛片在线| 欧美中文字幕在线观看| 欧美一级播放| 国产精品毛片va一区二区三区| 亚洲三级影院| 99av国产精品欲麻豆| 久久亚洲精品网站| 麻豆精品在线视频| 韩国v欧美v日本v亚洲v| 欧美亚洲在线播放| 久久精品av麻豆的观看方式 | 亚洲免费在线精品一区| 亚洲综合精品四区| 国产精品久久久999| 日韩视频在线一区二区| 亚洲精品裸体| 欧美激情一区二区| 亚洲激情欧美激情| 99re在线精品| 欧美色图麻豆| 亚洲淫片在线视频| 久久福利视频导航| 国产综合一区二区| 久久狠狠亚洲综合| 欧美成人精品h版在线观看| 亚洲风情亚aⅴ在线发布| 欧美二区不卡| 一区二区动漫| 久久国产视频网站| 1024成人| 欧美日本在线看| 亚洲素人一区二区| 久久看片网站| 亚洲欧洲另类国产综合| 欧美日韩大片| 亚洲欧美日韩爽爽影院| 久久综合狠狠综合久久综合88| 亚洲第一精品福利| 欧美视频一区二区三区四区| 亚洲欧美激情视频| 免费看的黄色欧美网站| 9人人澡人人爽人人精品| 国产精品久久九九| 欧美激情国产高清| 欧美日韩一级视频| 亚洲夜间福利| 久热成人在线视频| 欧美日韩免费看| 亚洲一区视频在线观看视频| 久久精品视频免费| 日韩视频在线一区二区| 国产精品夜色7777狼人| 久久精品首页| 99国内精品久久| 久久亚洲国产成人| 亚洲小说欧美另类婷婷| 狠狠色狠狠色综合日日tαg| 欧美黄色大片网站| 欧美伊人精品成人久久综合97| 亚洲国产成人久久| 欧美一区二视频| 99riav久久精品riav| 国产资源精品在线观看| 欧美色图五月天| 噜噜噜久久亚洲精品国产品小说| 一区二区三区视频免费在线观看| 久热精品视频| 午夜精品久久久久久久99热浪潮| 亚洲国产精品久久久| 国产精品一区二区三区免费观看| 免费欧美日韩国产三级电影| 午夜精品福利一区二区三区av| 亚洲精品国产精品久久清纯直播| 久久爱www.| 亚洲欧美日韩国产中文在线| 亚洲精品免费观看| 亚洲福利小视频| 国内精品久久久久久久果冻传媒| 国产精品扒开腿做爽爽爽软件| 久久久噜噜噜久久中文字免| 一区二区三区日韩欧美精品| 91久久精品一区二区三区| 国产综合av| 国产午夜精品美女毛片视频| 国产精品久久久久影院色老大| 欧美精品一区二| 欧美a级在线| 美女主播一区| 久久婷婷国产综合精品青草| 欧美中文字幕在线视频| 午夜欧美电影在线观看| 亚洲午夜三级在线| 中国成人在线视频| 亚洲麻豆av| 亚洲精品国产精品国自产在线 | 伊人蜜桃色噜噜激情综合| 国产日韩欧美视频| 国产精品看片资源| 欧美大片免费看| 免费在线亚洲欧美| 欧美aⅴ99久久黑人专区| 老司机免费视频一区二区| 免费成人av资源网| 欧美精品久久久久久久久老牛影院 | 亚洲自拍偷拍麻豆| 亚洲女同同性videoxma| 亚洲一区二区黄| 午夜精品久久久久久久久久久久| 亚洲欧美激情一区| 先锋影音久久久| 国产嫩草影院久久久久| 久久久久久久一区二区| 久久成人精品| 日韩视频亚洲视频| 亚洲黄色av| 久久久亚洲一区| 欧美a级在线| 最新日韩av| 欧美日韩国产小视频在线观看| 亚洲激情小视频| 亚洲精品日韩在线观看| 欧美成人四级电影| 亚洲国产精品热久久|