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

隨筆-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| 亚洲婷婷综合久久一本伊一区| 亚洲人成网站999久久久综合| 久久久国产视频91| 久久精品国产一区二区三区免费看 | 欧美91视频| 欧美福利一区二区| 国产精品大片| 国产在线视频欧美一区二区三区| 永久免费精品影视网站| 99re热这里只有精品免费视频| 亚洲性视频h| 欧美在线观看视频一区二区| 久久在线观看视频| 99re8这里有精品热视频免费 | 日韩视频在线观看国产| 99亚洲一区二区| 欧美亚洲一区二区在线| 久热这里只精品99re8久| 欧美日韩国产色综合一二三四| 国产精品日本精品| 在线观看欧美精品| 亚洲欧美日韩精品久久奇米色影视 | 欧美激情一区二区三区在线| 99国产精品视频免费观看一公开| 香蕉久久国产| 欧美日韩国产综合网| 韩日在线一区| 亚洲欧美日韩另类| 欧美电影免费观看| 欧美一区二区三区免费视| 欧美精品国产精品日韩精品| 国内精品久久久久久久影视麻豆| 在线一区二区三区四区| 免费h精品视频在线播放| 一本色道婷婷久久欧美| 久久免费黄色| 国产主播一区| 久久se精品一区二区| 在线亚洲精品| 欧美日韩另类视频| 亚洲欧洲一区二区天堂久久| 久久精品一区二区三区中文字幕| 妖精成人www高清在线观看| 蜜臀久久久99精品久久久久久| 国产一区二区在线免费观看| 亚洲专区免费| 亚洲免费在线观看视频| 国产精品久久97| 日韩午夜剧场| 欧美高清在线播放| 久久精品一区二区三区四区| 国产欧美日韩另类视频免费观看| 亚洲一区二区三区免费观看| 亚洲精品护士| 欧美日韩国产精品一区| 亚洲精品偷拍| 91久久精品日日躁夜夜躁国产| 久久影视三级福利片| 激情欧美日韩一区| 老司机67194精品线观看| 欧美亚洲在线播放| 激情综合色综合久久| 久久综合国产精品| 久久精品视频在线| 亚洲国产视频直播| 亚洲三级电影在线观看| 欧美日韩精品免费观看| 亚洲专区在线视频| 亚洲欧美不卡| 好吊妞这里只有精品| 老鸭窝91久久精品色噜噜导演| 久久精品国产精品亚洲精品| 狠狠入ady亚洲精品| 欧美国产综合一区二区| 欧美激情欧美激情在线五月| 宅男66日本亚洲欧美视频| 亚洲少妇在线| 国产欧美成人| 免费视频一区| 欧美日韩黄视频| 欧美亚洲综合在线| 玖玖综合伊人| 在线一区二区视频| 久久精品九九| 一本久久知道综合久久| 亚洲无限av看| 亚洲国产精品ⅴa在线观看| 亚洲精品欧美日韩专区| 国产精品一区免费在线观看| 欧美77777| 国产精品极品美女粉嫩高清在线| 久久国内精品自在自线400部| 久久久久一区二区三区| 亚洲欧洲一区二区天堂久久| 亚洲一级片在线看| 亚洲欧洲精品一区二区三区不卡| 亚洲一区二区视频在线观看| 亚洲国产日韩欧美综合久久| 在线视频亚洲欧美| 亚洲国产日韩一区| 亚洲欧美一区二区三区极速播放| 在线免费观看日本欧美| 亚洲手机视频| 日韩视频在线一区| 欧美影视一区| 午夜一区不卡| 欧美日本在线播放| 久久性色av| 国产精品色婷婷| 一本久道久久综合狠狠爱| 国产一区深夜福利| 欧美一区二区三区视频在线 | 欧美一区不卡| 一本色道久久加勒比精品| 亚洲欧美在线免费| 亚洲天天影视| 欧美xx视频| 美女脱光内衣内裤视频久久网站| 欧美小视频在线| 91久久国产精品91久久性色| 国产日韩欧美一区在线| 一本综合精品| 在线视频精品一区| 免费中文日韩| 你懂的成人av| 国产一区在线视频| 性欧美长视频| 久久国产精品久久久久久| 欧美日韩午夜剧场| 亚洲三级影片| 日韩一级在线| 欧美国产91| 亚洲电影在线| 亚洲精品你懂的| 欧美成人资源网| 亚洲韩国精品一区| 亚洲伦理在线免费看| 欧美成人一区二区在线| 亚洲高清一二三区| 亚洲精品视频在线观看网站| 久久久综合香蕉尹人综合网| 久久国产精品72免费观看| 国产精品永久在线| 性xx色xx综合久久久xx| 久久9热精品视频| 国产人妖伪娘一区91| 久久国产精品99国产精| 久久这里只有| 亚洲欧洲一区二区三区| 欧美激情自拍| 国产精品99久久久久久久久| 翔田千里一区二区| 国产日韩精品视频一区二区三区 | 午夜日韩电影| 久久久不卡网国产精品一区| 狠狠久久亚洲欧美| 蘑菇福利视频一区播放| 亚洲免费成人av电影| 亚洲欧美资源在线| 国产一区二区日韩| 老司机67194精品线观看| 亚洲国产精品va在看黑人| av成人天堂| 国产日韩亚洲欧美精品| 久久免费观看视频| 亚洲三级观看| 久久都是精品| 亚洲精品综合久久中文字幕| 欧美日韩国产影院| 亚洲欧美三级在线| 亚洲成在线观看| 香蕉精品999视频一区二区| 国产欧美日韩中文字幕在线| 先锋影音久久| 影音欧美亚洲| 欧美成人综合一区| 国产综合久久| 久久国产精品久久久久久久久久| 欧美成人精品影院| 久久综合伊人77777麻豆| 国产欧美一区二区三区视频| 亚洲已满18点击进入久久| 蜜桃av噜噜一区| 久久丁香综合五月国产三级网站| 欧美视频观看一区| 香蕉成人啪国产精品视频综合网| 久久美女艺术照精彩视频福利播放| 亚洲精品乱码| 欧美日韩精品免费| 欧美一区二区三区视频免费播放| 最新亚洲激情| 国产精品日韩专区| 欧美成人一区二区三区| 久久婷婷国产综合尤物精品| 激情成人在线视频| 亚洲高清不卡在线| 国产精品日韩一区二区|