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

隨筆-14  評(píng)論-8  文章-0  trackbacks-0

     題目及解題程序給在末尾,先來(lái)看看排列一個(gè)數(shù)組的方法。

     給定一個(gè)數(shù)組 array[] = {3, 1, 2, 4, 0}; 這個(gè)給定的數(shù)組有目的性,即它符合 n * m 的規(guī)則,這里是 5 * 5(5個(gè)元素,5個(gè)連續(xù)且不同的值)。按我想到的一般的方法,就是使用循環(huán)來(lái)求出各種排列的可能,但這種方法不能確保每個(gè)元素只出現(xiàn)一次,且隨著元素個(gè)數(shù)的增長(zhǎng),循環(huán)深度將變得很深。繼續(xù)想下去,這種方法將會(huì)變得很復(fù)雜,這就要求我尋找另外一種方法。注意到每個(gè)元素并不相同,那么要使各個(gè)元素在每個(gè)位置上只出現(xiàn)一次,很明顯的一種方法就是“彩票機(jī)讀票法”。比如數(shù)據(jù)讀入口在第一個(gè)元素的位置,那么依次循環(huán)這個(gè)數(shù)組,每次使后面的元素向前移動(dòng)一位,各個(gè)數(shù)字不就都讀到了嗎,這就像在打印機(jī)中滾動(dòng)的紙。具體步驟如下:

31240
12403 <—rotate

     第一位如此,那么后面的每一位也如此,也就是遞歸地處理后面的數(shù)字,每移動(dòng)一位就以下一位為起點(diǎn)做相同的處理,直到所有數(shù)字循環(huán)了一遍,那排列的工作也就完成了。一個(gè)具體的實(shí)現(xiàn)如下:

/*
 * @param r:     需要求其排列的向量
 * @param iPos:  當(dāng)前所進(jìn)行到的位置
 * 程序體中的注釋表示處于那個(gè)位置的向量都是一個(gè)新的且唯一的排列
*/
void rotate(vector<int>& r, int iPos) {

    if(iPos == r.size() - 1)//是否循環(huán)完畢,調(diào)用函數(shù)時(shí) 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)//循環(huán)前移
            r[j] = r[j + 1];
        r[r.size() - 1] = t;

        if(i != r.size() - 1) {
            //a different permutation, do something here
        }

        rotate(r, iNextPos);//從下一位數(shù)字開(kāi)始新的位移
    }
}
   這種方法不要求數(shù)字式連續(xù)的,也不用事先規(guī)定好向量的長(zhǎng)度。只是當(dāng)向量長(zhǎng)度到了一定的時(shí)候,運(yùn)算時(shí)間會(huì)很長(zhǎng)!其它方法未知……
   topcoder 上的練習(xí)題如下:

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 崇文 閱讀(2111) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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ⅴ99久久黑人专区| 亚洲三级电影在线观看| 欧美精品在线观看一区二区| 一本色道婷婷久久欧美| 久久动漫亚洲| 亚洲国产成人久久| 欧美日韩一二三四五区| 亚洲欧美成人网| 裸体女人亚洲精品一区| 亚洲国产精品成人精品| 久久最新视频| 正在播放日韩| 猫咪成人在线观看| 一本大道久久精品懂色aⅴ| 国产精品vvv| 久久精品视频亚洲| 亚洲理论在线| 久久免费高清| 亚洲一区二区三区精品动漫| 国产亚洲精品资源在线26u| 麻豆成人在线| 亚洲在线成人精品| 亚洲国产精品一区制服丝袜| 一区二区三区免费看| 国产精品―色哟哟| 美女黄毛**国产精品啪啪| 一本一本a久久| 久久综合给合久久狠狠色| 夜夜狂射影院欧美极品| 狠狠综合久久av一区二区老牛| 免费国产自线拍一欧美视频| 亚洲一区影音先锋| 欧美成人一品| 久久久国际精品| 在线视频亚洲一区| 国产一区二区三区av电影| 欧美日韩激情小视频| 欧美一区午夜精品| 一区二区三区**美女毛片| 欧美成人精品一区二区| 久久激情综合网| 亚洲性视频网站| 亚洲精选一区二区| 国内精品久久久久影院 日本资源| 欧美日韩国产首页在线观看| 久久视频在线看| 欧美在线播放| 亚洲欧美区自拍先锋| 亚洲剧情一区二区| 亚洲国产精品高清久久久| 久久久久久91香蕉国产| 午夜精品av| 亚洲综合清纯丝袜自拍| aa日韩免费精品视频一| 亚洲人成在线免费观看| 尤物网精品视频| 韩日精品视频一区| 国产日韩欧美| 国产精品家庭影院| 欧美亚州一区二区三区| 欧美日韩裸体免费视频| 欧美大片在线影院| 欧美成人免费网| 久久精品99无色码中文字幕| 午夜国产一区| 欧美一区在线看| 欧美一区在线直播| 久久久99爱| 久久久久久91香蕉国产| 久久免费视频观看| 久久久一区二区| 久久综合九色综合欧美狠狠| 久久久久免费观看| 久久夜色精品| 欧美高清视频| 亚洲激情在线观看| 亚洲精品视频啊美女在线直播| 欧美高清hd18日本| 免费一级欧美片在线播放| 欧美成人精品1314www| 久热re这里精品视频在线6| 久久久久久夜| 欧美黄色aaaa| 亚洲丰满少妇videoshd| 最新中文字幕一区二区三区| 91久久精品久久国产性色也91| 亚洲精品一区二区在线| aa级大片欧美| 亚洲一区www| 久久精品夜色噜噜亚洲aⅴ| 久久欧美肥婆一二区| 久久久久久久一区| 欧美高清在线视频观看不卡| 欧美日韩在线综合| 国产乱码精品| 亚洲国产99| 在线亚洲欧美| 久久精品天堂| 亚洲国产人成综合网站| 日韩午夜黄色| 久久国内精品视频| 欧美福利影院| 国产精品日日摸夜夜添夜夜av| 国内外成人在线| 亚洲精品孕妇| 久久精品99国产精品日本| 欧美大片一区| 亚洲影视在线播放| 美女爽到呻吟久久久久| 国产精品美女久久久| 在线精品福利| 午夜精品一区二区三区在线视| 久久久久9999亚洲精品| 亚洲国产一区二区三区在线播| 亚洲午夜精品在线| 玖玖综合伊人| 国产啪精品视频| 日韩一区二区免费高清| 久久国产精品色婷婷| 亚洲精品国偷自产在线99热| 久久不射网站| 国产精品每日更新在线播放网址| 亚洲第一偷拍| 久久se精品一区二区| 亚洲欧洲三级电影| 午夜视频一区在线观看| 欧美精品日韩精品| 在线成人av.com| 久久xxxx精品视频| 99视频有精品| 理论片一区二区在线| 欧美亚韩一区| aa亚洲婷婷| 亚洲电影免费| 久久青草久久| 亚洲一二三四区| 欧美日韩色婷婷| 亚洲欧洲一区二区三区久久| 久久一区国产| 性色一区二区| 国产精品久久久久久模特| 9色精品在线| 亚洲日韩视频| 欧美成人在线影院| 在线看片日韩| 男男成人高潮片免费网站| 欧美在线观看网站| 国产欧美一区二区视频| 亚洲欧美视频在线观看| 亚洲精品国产精品乱码不99| 久热精品视频在线| 影音先锋中文字幕一区| 久久这里有精品15一区二区三区| 亚洲欧美一区二区精品久久久| 欧美色大人视频| 亚洲天堂av在线免费| 99天天综合性| 国产精品扒开腿做爽爽爽软件| 夜夜嗨av一区二区三区四季av| 亚洲精品一区二区在线观看| 欧美日韩精品一二三区| 一区二区三区高清| aa级大片欧美| 国产精品一区二区男女羞羞无遮挡| 亚洲一区三区电影在线观看| 一区二区三区日韩精品视频| 国产精品高潮呻吟| 在线视频你懂得一区| 亚洲国产一二三| 欧美日韩亚洲三区| 亚洲欧美日韩一区| 亚洲视频综合| 国产无一区二区| 男女精品视频| 欧美电影免费观看高清| 夜夜嗨av一区二区三区四区| 亚洲天堂av电影| 国产亚洲在线| 国产亚洲成av人片在线观看桃 | 中日韩在线视频| 在线亚洲+欧美+日本专区| 国产精品美女黄网| 老**午夜毛片一区二区三区| 免费成人毛片| 中文国产亚洲喷潮| 午夜宅男欧美| 亚洲精品国产精品乱码不99| 日韩亚洲综合在线| 国产一区二区三区免费不卡 | 午夜影院日韩| 亚洲国内自拍| 这里只有精品视频| 好吊一区二区三区|