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

隨筆-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>
            日韩一级在线观看| 久久精品中文字幕免费mv| 永久555www成人免费| 欧美日韩免费一区二区三区| 亚洲电影av| 欧美成人午夜免费视在线看片| 91久久精品国产91久久| 久久久精品动漫| 亚洲午夜伦理| 亚洲线精品一区二区三区八戒| 亚洲第一区在线观看| 欧美大片在线观看一区二区| 伊人成人网在线看| 一区免费在线| 亚洲精品麻豆| 亚洲视频一二| 久久精品理论片| 久久久国产精品一区二区三区| 亚洲欧美国产高清va在线播| 欧美伊人久久久久久午夜久久久久| 亚洲制服av| 欧美自拍偷拍| 女女同性精品视频| 91久久久久久久久久久久久| 亚洲日本va午夜在线电影| 宅男精品视频| 欧美另类视频在线| 亚洲男女毛片无遮挡| 久久午夜色播影院免费高清| 欧美精彩视频一区二区三区| 国产精品久久久久9999高清| 狠狠入ady亚洲精品| 一区二区欧美在线| 亚洲电影免费观看高清完整版在线 | 黄色日韩网站| 日韩亚洲欧美在线观看| 久久阴道视频| 亚洲欧美日韩天堂一区二区| 性18欧美另类| 欧美一二三区精品| 亚洲国产天堂久久国产91| 亚洲欧美日韩一区二区三区在线观看 | 亚洲精品久久久久中文字幕欢迎你 | 欧美二区视频| 久久一二三区| 亚洲风情亚aⅴ在线发布| 欧美粗暴jizz性欧美20| 国产精品你懂得| 日韩一二在线观看| 91久久久国产精品| 欧美视频网址| 欧美一区二区女人| 亚洲性夜色噜噜噜7777| 欧美日韩精品系列| 亚洲一区免费看| 久久精品一区二区三区四区| 亚洲缚视频在线观看| 亚洲人成艺术| 国产精品视频大全| 亚洲欧美国产高清| 久久精品国内一区二区三区| 亚洲承认在线| 亚洲性感美女99在线| 伊人男人综合视频网| 艳女tv在线观看国产一区| 国产一区二区丝袜高跟鞋图片| 91久久精品网| 永久久久久久| 在线视频精品一区| 国产日韩欧美自拍| 国产一区二区| 亚洲私人黄色宅男| 欧美承认网站| 亚洲精品孕妇| 欧美中文字幕不卡| 亚洲国产精品国自产拍av秋霞| 99视频精品| 国产欧美综合在线| 一个色综合av| 亚洲国产精品黑人久久久| 性视频1819p久久| 久久久人成影片一区二区三区| 国产精品人人做人人爽| 亚洲午夜视频在线| 性做久久久久久| 国产精品综合不卡av| 欧美一级大片在线观看| 久久xxxx精品视频| 国产乱人伦精品一区二区 | 亚洲一区二区三区免费观看| 欧美激情第三页| 一区二区精品在线| 久久深夜福利| 91久久久一线二线三线品牌| 欧美精品一卡| 欧美一区=区| 亚洲人成网站影音先锋播放| 亚洲欧美日韩国产精品| 国产一区在线免费观看| 六月婷婷一区| 一区二区福利| 欧美风情在线观看| 性欧美video另类hd性玩具| 亚洲第一黄色| 国产精品美女久久久久aⅴ国产馆| 亚洲男人第一网站| **性色生活片久久毛片| 欧美日韩不卡视频| 欧美一级精品大片| 亚洲精品日韩综合观看成人91| 亚洲中午字幕| 一本久道久久综合中文字幕| 在线观看亚洲精品视频| 国产精品美女www爽爽爽| 亚洲国产专区| 亚洲嫩草精品久久| 一区二区毛片| 一区二区三区产品免费精品久久75 | 久久综合五月| 亚洲天堂成人在线观看| 亚洲精品影视| 欧美国产成人在线| 亚洲国产精品嫩草影院| 久久精品在线免费观看| 午夜精品免费| 久久久久久电影| 欧美激情第二页| 亚洲精品一区二区三| 99精品视频免费观看| 中文日韩电影网站| 欧美一级播放| 欧美成人黄色小视频| 欧美精品免费在线| 欧美色欧美亚洲另类七区| 国产精品久久一区二区三区| 国产视频一区在线| 91久久久亚洲精品| 欧美一区二区精品在线| 欧美1区2区| 亚洲制服丝袜在线| 你懂的国产精品| 国产乱码精品一区二区三区忘忧草| 一区二区三区国产精华| 亚洲欧洲99久久| 欧美日本韩国一区| 国产乱肥老妇国产一区二| 亚洲高清在线观看| 午夜精品三级视频福利| 男人天堂欧美日韩| 久久国内精品自在自线400部| 欧美精品免费观看二区| 在线观看精品一区| 欧美专区中文字幕| 中文一区在线| 国产精品欧美日韩| 亚洲视频精品| 日韩视频中午一区| 99在线热播精品免费| 亚洲电影免费观看高清完整版在线观看 | 亚洲校园激情| 亚洲精品一二| 欧美精品在线观看一区二区| 亚洲欧洲综合另类在线| 亚洲国产精品成人va在线观看| 久久精品理论片| 激情视频一区二区三区| 久久国产欧美日韩精品| 性欧美1819sex性高清| 国产亚洲精品久久久久动| 久久精品国产免费观看| 欧美中文在线字幕| 亚洲欧洲另类国产综合| 91久久精品美女| 国产精品福利在线观看网址| 欧美亚洲一级片| 久久视频在线视频| 亚洲欧美国产视频| 久久久久久久久一区二区| 99精品福利视频| 在线亚洲观看| 最新日韩中文字幕| 亚洲一区国产一区| 性欧美办公室18xxxxhd| 亚洲欧美精品| 亚洲一区精品在线| 国产在线不卡精品| 亚洲国产成人tv| 欧美色图一区二区三区| 亚洲欧美日韩国产成人精品影院| 欧美制服丝袜第一页| 一区二区三区日韩在线观看| 欧美一区二区三区在线观看视频 | 亚洲一区二区三区中文字幕| 一区二区三区精密机械公司| 在线国产亚洲欧美| 亚欧美中日韩视频| 欧美一区二区三区在| 欧美三级视频| 一区二区三区精品| 亚洲欧美日韩天堂|