2016-09-06 82 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; 
}