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

隨筆-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>
            老司机午夜精品视频| 一区二区三区国产精品| 中文精品一区二区三区 | 在线精品国产成人综合| 久久全球大尺度高清视频| 久久久av水蜜桃| 韩国av一区二区三区在线观看| 久久综合色影院| 欧美日韩a区| 亚洲欧美在线看| 欧美一区影院| 亚洲精品小视频| 亚洲视频一二区| 悠悠资源网亚洲青| 日韩视频欧美视频| 国产精品婷婷午夜在线观看| 免播放器亚洲一区| 欧美日韩国产亚洲一区| 欧美一区二区三区播放老司机 | 欧美大片一区二区| 欧美婷婷六月丁香综合色| 久久精品二区| 欧美日韩国产不卡| 欧美精品一区二区高清在线观看| 一区二区三区四区精品| 欧美中文字幕在线视频| 日韩午夜精品| 久久国产主播| 亚洲自拍啪啪| 美女999久久久精品视频| 亚洲男人影院| 欧美激情麻豆| 久久在线91| 国产精品一区二区a| 最新日韩在线视频| 伊人成年综合电影网| 中国成人在线视频| 日韩视频免费在线| 久久精品国产亚洲高清剧情介绍| 一区二区三区视频观看| 久久最新视频| 久久gogo国模裸体人体| 欧美特黄一区| 91久久精品美女高潮| 影视先锋久久| 欧美一区二区三区成人| 亚洲一区二区三区在线看| 欧美高清视频在线播放| 欧美高清视频在线| 狠狠色综合网| 欧美一区二区三区播放老司机| 亚洲欧美国产毛片在线| 欧美日韩免费在线| 亚洲人成人一区二区在线观看| 亚洲国产欧美久久| 久久资源av| 男女激情久久| 亚洲电影av在线| 美脚丝袜一区二区三区在线观看 | 亚洲特级片在线| 欧美激情一区二区三区| 国产欧美日韩激情| 在线视频免费在线观看一区二区| 一本高清dvd不卡在线观看| 你懂的国产精品| 亚洲第一精品夜夜躁人人躁| 亚洲电影在线免费观看| 欧美不卡一卡二卡免费版| 亚洲国产精品成人久久综合一区 | 国产精品美女久久久| 亚洲视频视频在线| 久久9热精品视频| 国产又爽又黄的激情精品视频| 欧美一进一出视频| 免费成人高清| 亚洲另类一区二区| 欧美日韩午夜在线| 亚洲欧美久久久久一区二区三区| 小辣椒精品导航| 极品裸体白嫩激情啪啪国产精品| 久久久久久久欧美精品| 亚洲观看高清完整版在线观看| 99av国产精品欲麻豆| 国产精品一区二区欧美| 久久久久99| 亚洲人妖在线| 欧美在线啊v一区| 亚洲国产精品福利| 欧美日韩亚洲激情| 欧美一区三区二区在线观看| 欧美大尺度在线观看| 亚洲一区三区在线观看| 国内成+人亚洲| 欧美日韩国产影片| 久久成人免费电影| 亚洲精品在线看| 久久久人成影片一区二区三区| 亚洲黄色有码视频| 国产精品嫩草99av在线| 女人天堂亚洲aⅴ在线观看| 亚洲视频一二三| 亚洲第一黄网| 欧美一区影院| 日韩特黄影片| 精品88久久久久88久久久| 欧美日韩在线看| 久久天堂精品| 欧美一级理论性理论a| 亚洲日本在线观看| 美日韩精品视频免费看| 欧美18av| 久久精品国产亚洲一区二区三区| 亚洲人成网站777色婷婷| 久久久噜噜噜久久| 亚洲综合99| 99国产精品久久久久久久成人热| 国产偷久久久精品专区| 欧美日韩精品一区二区| 麻豆久久久9性大片| 欧美一级淫片aaaaaaa视频| 一区二区三区四区蜜桃| 亚洲国产精品日韩| 欧美成人高清| 久久久亚洲国产美女国产盗摄| 亚洲综合色噜噜狠狠| 亚洲精品一区在线| 亚洲国产精品热久久| 国产一区二区三区四区在线观看| 欧美午夜视频在线| 欧美日韩视频在线| 欧美日本三区| 欧美成人综合一区| 美国十次成人| 免费成人高清视频| 毛片基地黄久久久久久天堂| 老司机精品视频网站| 久久久久久久久一区二区| 欧美综合国产| 久久超碰97人人做人人爱| 欧美一区成人| 久久福利资源站| 久久久久成人精品免费播放动漫| 欧美一区二区视频97| 欧美在线一二三| 久久精品官网| 久久综合伊人77777尤物| 久久综合狠狠| 欧美成人午夜激情在线| 欧美理论大片| 欧美色图麻豆| 国产精品―色哟哟| 国产偷自视频区视频一区二区| 国产一区二区三区免费不卡| 一区精品久久| 91久久综合亚洲鲁鲁五月天| 日韩视频亚洲视频| 亚洲欧美日韩直播| 久久久99免费视频| 亚洲电影专区| 在线中文字幕日韩| 久久xxxx| 欧美黄污视频| 国产精品一区二区久久久久| 国内外成人免费激情在线视频网站| 亚洲承认在线| 一区二区三区四区国产精品| 久久精品二区三区| 欧美bbbxxxxx| 一区二区久久久久| 久久精品色图| 欧美激情一区二区三区成人 | 欧美一区午夜精品| 欧美成人自拍| 国产欧美日韩一区二区三区在线| 在线欧美一区| 欧美一级久久| 亚洲国产精品尤物yw在线观看| 一本不卡影院| 另类专区欧美制服同性| 欧美吻胸吃奶大尺度电影| 国产综合在线看| 99成人在线| 久久亚洲一区二区| 制服丝袜亚洲播放| 免费在线观看日韩欧美| 国产欧美一区二区色老头| 亚洲精品小视频| 久久久久欧美| 亚洲电影免费观看高清完整版在线观看 | 在线视频日韩| 久久久夜夜夜| 国产毛片一区二区| 一区二区日韩欧美| 看片网站欧美日韩| 亚洲欧美日韩综合一区| 欧美久久久久久久久久| 尤物yw午夜国产精品视频| 久久se精品一区二区| 夜夜嗨av一区二区三区四季av| 免费成人黄色av|