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

隨筆-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>
            狂野欧美一区| 午夜精品久久久久久久久 | 欧美日韩成人在线| 欧美韩国日本综合| 欧美精品一区二区三区久久久竹菊 | 欧美三级视频在线观看| 欧美极品色图| 国产精品国产三级国产普通话99 | 亚洲国产影院| 91久久久久久国产精品| 亚洲性夜色噜噜噜7777| 欧美伊人精品成人久久综合97| 久久嫩草精品久久久久| 亚洲黄色有码视频| 亚洲国产精品一区二区尤物区| 在线综合欧美| 久久九九国产精品怡红院| 欧美国产成人在线| 国产亚洲a∨片在线观看| 亚洲电影免费观看高清| 亚洲永久免费av| 欧美成人精品不卡视频在线观看| 日韩亚洲视频在线| 久久免费午夜影院| 国产精品视频免费观看www| 最新国产の精品合集bt伙计| 性色av一区二区三区| 欧美成人一区二区在线| 亚洲性线免费观看视频成熟| 免费成人高清视频| 国产亚洲在线| 午夜精品久久久久久久久| 亚洲电影下载| 久久久久一本一区二区青青蜜月| 欧美日韩精品国产| 91久久综合亚洲鲁鲁五月天| 欧美在线观看视频在线| av成人黄色| 欧美理论在线| 亚洲欧洲视频在线| 久久国产日本精品| 久久久夜色精品亚洲| 在线视频一区观看| 欧美国产视频在线观看| 一区二区三区在线看| 久久精品国产亚洲a| 亚洲女优在线| 国产伦精品一区二区三区照片91| 在线视频日韩精品| 亚洲日本欧美天堂| 欧美~级网站不卡| 欧美电影在线观看| 欧美不卡福利| 精品不卡一区| 久久久久国产精品一区三寸| 亚洲综合好骚| 国产精品一区二区在线观看| 亚洲女人天堂av| 日韩午夜在线播放| 欧美日韩在线亚洲一区蜜芽| 在线亚洲一区二区| 这里只有精品在线播放| 国产精品欧美风情| 久久国产精品久久久久久久久久| 亚洲综合大片69999| 国产欧美一区二区三区久久人妖| 午夜日韩视频| 午夜视黄欧洲亚洲| 激情成人av在线| 欧美顶级少妇做爰| 欧美精品一区在线播放| 亚洲视频狠狠| 国产精品99久久99久久久二8| 欧美色网一区二区| 欧美在线观看日本一区| 久久久九九九九| 亚洲私人影院| 亚洲免费久久| 99www免费人成精品| 国产精品日韩在线播放| 久久男女视频| 蘑菇福利视频一区播放| 一本色道久久综合狠狠躁篇的优点| 欧美激情aⅴ一区二区三区| 你懂的国产精品| 亚洲欧美日韩精品久久久久| 久久成人人人人精品欧| 亚洲大片在线| 99视频精品全部免费在线| 国产美女精品在线| 欧美激情中文字幕乱码免费| 欧美天堂亚洲电影院在线观看| 久久本道综合色狠狠五月| 久久福利一区| 亚洲天堂激情| 久久精品一区四区| 日韩视频免费在线| 欧美一级久久| 亚洲精品在线二区| 午夜精品久久久久久99热软件| 亚洲国产欧美日韩另类综合| 亚洲一区二区三区影院| 日韩香蕉视频| 久久精品视频在线| 亚洲一区二区三区激情| 美女黄网久久| 久久精品国产v日韩v亚洲| 欧美激情一区二区三区在线视频观看 | 亚洲欧美影音先锋| 欧美在线观看视频| 一道本一区二区| 久久久精品视频成人| 亚洲自拍电影| 欧美大片免费观看| 久久久久中文| 国产精品欧美精品| 亚洲高清视频中文字幕| 国产亚洲毛片| 亚洲少妇自拍| 99天天综合性| 欧美二区在线播放| 嫩草国产精品入口| 一区在线播放视频| 久久久久久久一区二区| 久久精品国产一区二区三| 国产精品午夜久久| 亚洲系列中文字幕| 亚洲在线第一页| 欧美日韩精品免费观看视频| 欧美www视频在线观看| 精品91久久久久| 久久精品国产亚洲一区二区三区| 久久av在线| 国产欧美在线| 午夜亚洲性色福利视频| 午夜亚洲视频| 国产精品视频在线观看| 亚洲一区3d动漫同人无遮挡| 亚洲线精品一区二区三区八戒| 欧美日韩大陆在线| 日韩一级片网址| 亚洲一区二区三区四区五区黄| 欧美日韩一区在线播放| 亚洲天堂av电影| 欧美一区二区三区免费视频| 国产精品久久国产精品99gif | 国产精品美女www爽爽爽| 在线亚洲+欧美+日本专区| 亚洲性感激情| 国产精品免费观看在线| 亚洲欧美日韩精品在线| 先锋影音国产一区| 国产日韩在线视频| 久久久综合网站| 亚洲观看高清完整版在线观看| 亚洲激情第一页| 欧美日韩国产色视频| 一区二区三区精品视频在线观看| 欧美一区二区视频在线| 尤物九九久久国产精品的特点| 美女国产一区| 亚洲自拍三区| 欧美激情亚洲国产| 亚洲中午字幕| 伊人影院久久| 欧美日韩影院| 久久精品欧美| 日韩视频在线一区二区| 久久99伊人| 亚洲日本视频| 国产日韩精品一区二区| 欧美大片免费| 久久国产精彩视频| 99av国产精品欲麻豆| 91久久亚洲| 91久久精品网| 久久精品国产精品亚洲| 亚洲国产精品一区二区第一页 | 日韩视频精品在线| 国产欧美另类| 久久久久高清| 欧美成人午夜剧场免费观看| 宅男精品视频| 亚洲电影av在线| 国产日产亚洲精品| 欧美体内she精视频在线观看| 老司机午夜精品视频| 亚洲图色在线| 亚洲美女精品一区| 欧美韩日一区二区| 久久久水蜜桃av免费网站| 一本久久综合亚洲鲁鲁| 一区在线播放视频| 国产乱码精品1区2区3区| 欧美久久在线| 久久天堂精品| 欧美中文字幕在线观看| 亚洲欧美日韩国产另类专区| 99综合精品| 亚洲精品视频在线播放|