2016-09-06 84 views
1

因此,我有一個循環,並且在每次迭代中,我希望以不同的順序遍歷整個循環,直到滿足結束條件。在每次迭代中以不同順序循環顯示項目列表

在每次迭代中,控制我想要通過循環變化的順序的變量。

例如,

while (endCondition == false){ 
     Item1; 
     Item2; 
     Item3; 
    } 

我第一次進入循環,我想它的順序1,2,3經歷。第二次:2,1,3 ...依此類推(只有我不知道第n次迭代的順序)

有沒有辦法實現這一點?歡迎所有建議!

編輯:我知道前一次迭代結束時迭代的順序。我想知道如何執行這個排列。

Item1,Item2,Item3是將元素推入堆棧的函數。循環運行直到endCondition元素被推送。在每次迭代結束時,使用上面的函數,頂層元素將被用作引用,以在下一次迭代中添加3個元素。我想優先考慮推入堆棧的元素以更快地達到endCondition。 優先順序取決於頂端元素與endCondition的接近程度。

while(maze[currPos_y][currPos_x] != DESTINATION){ 

     int flag = 0; 

     //Adding all open spaces around current position to stack 
     if(maze[currPos_y + 1][currPos_x] == OPEN){ 
      path.push(currPos_y+1, currPos_x); 
      flag++; 
     } 

     if(maze[currPos_y][currPos_x + 1] == OPEN){ 
      path.push(currPos_y, currPos_x + 1); 
      flag++; 
     } 

     if(maze[currPos_y][currPos_x - 1] == OPEN){ 
      path.push(currPos_y,currPos_x - 1); 
      flag++; 
     } 

     if(maze[currPos_y - 1][currPos_x] == OPEN){ 
      path.push(currPos_y - 1, currPos_x); 
      flag++; 
     } 

     //If path is blocked 
     if (flag <= 1){ 
      path.pop(); 
     } 

     currPos_x = path.top_x(); 
     currPos_y = path.top_y(); 

} 

path是我實現的一個堆棧。沒有問題與堆棧,它工作正常。

正如你所看到的,如果二維數組maze的尺寸很大,這段代碼將會運行很長時間。所以我想按照DESTINATION的方向加快速度。所以最接近DESTINATION的位置將被推後以便首先被訪問。

+0

你的意思是你想循環中的n項的隨機排列?或者你的意思是你知道迭代開始時的順序是什麼,只想知道如何執行排列? –

+1

@RobertPrévost我知道每次迭代開始時的順序是什麼,並且想知道如何執行排列。我將編輯問題 – Apara

+0

如果我正確理解你,你可能想看看['std :: next_permutation'](http://en.cppreference.com/w/cpp/algorithm/next_permutation) –

回答

2

在我看來,像花園品種std::map將是適當的容器在這裏。

根據您的問題中提供的信息,您似乎知道將什麼序數值分配給您的對象的每個實例。你知道哪個對象是對象#1,哪一個是對象#2,哪一個是#3,依此類推。

如果是這樣,那麼只要把你的對象變成

std::map<int, object_type> m; 

然後,當你有[1,2,3]的順序,繼續前進,做你想做的與你的對象,通過訪問m[1]m[2],然後m[3]

然後,如果下一次迭代你探視的順序是[3,1,2],繼續做你的事與m[3]m[1]m[2]

如果你的類沒有默認的構造函數,並且你不能使用operator[];如果是這種情況,如果需要的話,這只是一小部分細節。

+2

我錯過了什麼,或者數組/矢量在這裏可以滿足嗎? – Galik

+0

我想我明白你在說什麼。但是如果我的物品是功能呢。那麼我將如何創建一張地圖呢?我是C++新手。所以這個問題可能看起來很幼稚。 – Apara

+0

函數指針或'std :: function'等... –

1

您可以試試下面的代碼。不知道你是如何得到這種模式的,我沒有解決這個問題。這應該給你至少另一種相當傳統的方法。

#include <iostream> 
#include <vector> 

using namespace std; 

int subtractOne(int num){ 
    return num - 1; 
} 

vector<int> patternIteration(vector<int> pattern, vector<int> nums){ 
    vector<int> ret; 
    for (int i = 0; i < pattern.size(); i++){ 
     ret.push_back(subtractOne(nums.at(pattern.at(i)))); 
    } 
    return ret; 
} 

int main(int argc, const char * argv[]) { 
    vector<int> answer = patternIteration({2, 3, 1, 0}, {5, 1, 3, 8}); 

    for (int i = 0; i < answer.size(); i++){ 
     cout << answer.at(i) << " \n"; 
    } 
    return 0; 
}