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

隨筆-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>
            一区久久精品| 久久天堂精品| 欧美大尺度在线| 久久九九国产| 国产欧美日韩视频| 亚洲视频欧美在线| 一本一本a久久| 欧美国产在线视频| 亚洲成色777777女色窝| 国内成+人亚洲| 欧美在线一级视频| 久久久夜色精品亚洲| 国产日韩欧美二区| 午夜精品久久久久久久久久久久| 模特精品在线| 欧美黄污视频| 亚洲精品免费网站| 欧美精品aa| 日韩一区二区精品| 亚洲一区二区三区777| 欧美日韩一区二区视频在线观看 | 野花国产精品入口| av成人黄色| 欧美午夜精品电影| 亚洲一区二区三区精品视频| 性做久久久久久免费观看欧美| 国产精品国产精品| 午夜精品剧场| 美女主播一区| 亚洲另类黄色| 国产精品福利久久久| 亚洲一区二区视频在线观看| 欧美在线视频一区二区三区| 国产一区二区电影在线观看| 久久午夜精品| 日韩视频一区二区三区在线播放| 亚洲图片自拍偷拍| 国产女主播在线一区二区| 欧美专区日韩专区| 欧美韩日一区二区三区| 中国成人亚色综合网站| 国产精品五区| 另类春色校园亚洲| 99国产麻豆精品| 久久久亚洲人| 在线一区二区日韩| 国产在线观看精品一区二区三区| 免费毛片一区二区三区久久久| 亚洲精品欧美极品| 久久精品人人| 99国产精品久久久久久久成人热| 国产精品热久久久久夜色精品三区 | 亚洲一区二区三区四区在线观看| 欧美在线你懂的| 亚洲精品国产精品乱码不99| 欧美午夜理伦三级在线观看| 久久精品一区二区国产| 亚洲欧洲精品一区二区| 欧美一区二区久久久| 亚洲激情在线播放| 国产欧美日韩亚洲一区二区三区| 免费日韩av| 欧美亚洲视频在线观看| 亚洲精品1234| 噜噜噜噜噜久久久久久91| 亚洲一区国产一区| 亚洲国产美女| 国产性色一区二区| 久久精品国产第一区二区三区最新章节 | 你懂的视频一区二区| 亚洲一区二区视频在线观看| 欧美激情一区二区三区高清视频| 欧美在线视频一区二区| 一本一道久久综合狠狠老精东影业 | 欧美电影免费观看| 欧美在线视频a| 亚洲小说区图片区| 亚洲三级国产| …久久精品99久久香蕉国产 | 一本色道精品久久一区二区三区 | 亚洲五月六月| 亚洲免费激情| 亚洲欧洲在线看| 欧美风情在线观看| 久久蜜桃资源一区二区老牛| 性欧美激情精品| 亚洲欧美另类国产| 一区二区三区免费网站| 亚洲精品一区二区三区福利| 精品91免费| 国内精品模特av私拍在线观看| 国产精品一区二区久久| 国产精品福利网| 国产精品福利在线观看网址| 欧美日韩在线一区| 欧美日韩国产精品自在自线| 欧美极品影院| 欧美二区在线看| 欧美激情一区二区在线 | 欧美系列亚洲系列| 欧美日韩一区二区三区四区五区| 欧美国产日韩二区| 欧美精品亚洲| 欧美日韩中文在线观看| 欧美色图五月天| 国产精品www.| 国产日韩精品久久久| 国产日韩欧美中文在线播放| 国产一级一区二区| 在线成人中文字幕| 亚洲国产mv| 亚洲乱码日产精品bd| 亚洲国产欧美日韩| 亚洲人成亚洲人成在线观看| 日韩午夜一区| 午夜精彩视频在线观看不卡| 欧美中文在线观看国产| 久久天天躁狠狠躁夜夜av| 欧美大片免费观看| 亚洲激情自拍| 亚洲午夜未删减在线观看| 欧美一区二区三区免费观看| 久久久激情视频| 欧美va亚洲va香蕉在线| 欧美三级日本三级少妇99| 国产美女精品在线| 在线日韩中文字幕| av成人动漫| 久久久夜精品| 亚洲精品影视| 欧美一区国产在线| 欧美精品一区二区三区四区| 国产精品视频一二| 亚洲国产影院| 午夜亚洲激情| 欧美激情黄色片| 亚洲综合电影| 久久婷婷av| 国产精品日韩欧美综合| 亚洲国产另类久久精品| 午夜精品区一区二区三| 欧美激情1区2区| 午夜久久久久久| 欧美国产日韩免费| 国语精品一区| 亚洲免费影视| 亚洲春色另类小说| 亚洲女同同性videoxma| 欧美国产日韩xxxxx| 国产视频在线观看一区二区三区 | 玖玖精品视频| 亚洲自拍偷拍麻豆| 欧美激情一区二区久久久| 国产亚洲成av人片在线观看桃| 99精品热6080yy久久 | 久久久国产精品一区| 亚洲毛片网站| 免费亚洲电影| 国语自产在线不卡| 香蕉久久夜色| 夜夜爽99久久国产综合精品女不卡| 久久国产精品一区二区三区四区 | 99国产成+人+综合+亚洲欧美| 久久成人精品视频| 国产精品日本一区二区| 9国产精品视频| 亚洲国产精品va在线观看黑人| 欧美一区=区| 国产精品午夜视频| 亚洲视频在线观看视频| 欧美激情亚洲综合一区| 久久久精品日韩| 国产一区二区在线观看免费| 午夜精品福利一区二区蜜股av| 亚洲精品一区二区三区福利| 免费观看30秒视频久久| 在线欧美福利| 美女日韩在线中文字幕| 久久久美女艺术照精彩视频福利播放| 国产精品一二三四区| 亚洲欧美视频在线| 一区二区精品国产| 国产精品v亚洲精品v日韩精品| 一本色道久久综合狠狠躁的推荐| 91久久国产综合久久蜜月精品 | 亚洲国产一区二区在线| 另类av导航| 亚洲欧洲一区二区三区久久| 欧美激情bt| 欧美精品免费视频| 亚洲视频综合| 亚洲深夜福利网站| 国产精品美女久久久久久久| 午夜精品福利视频| 午夜精品久久| 精品1区2区| 亚洲第一综合天堂另类专| 欧美精品aa| 午夜精品久久久久久久久久久久久| 一区二区三区国产在线|