⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 permuter.cpp

📁 C++&datastructure书籍源码,以前外教提供现在与大家共享
💻 CPP
字号:
#include "permuter.h"


void Permuter::Swap(int x1, int x2)
// post: myList[x1] and myList[x2] swapped
{
    int temp = myList[x1];
    myList[x1] = myList[x2];
    myList[x2] = temp;
}

void Permuter::Reverse(int first, int last)
// post: myList[first..last] reversed
{
    while (first < last)
    {   Swap(first,last);
        first++;
        last--;
    }
}

Permuter::Permuter(const tvector<int>& list)
  : myList(list),
    myOriginal(list),
    myFirst(false)
{

}

void Permuter::Init()
{
    myList = myOriginal;  
    myFirst = true;
}

bool Permuter::HasMore()
// post: returns false iff myList == myFirst
//       so that all permutations generated
{
    if (! myFirst)
    {   int k;
        for(k=0; k < myList.size(); k++)
        {  if (myList[k] != myOriginal[k])
           {   return true;
           }
        }
        return false;
    }
    myFirst = false;
    return true;
}

void Permuter::Current(tvector<int>& list)
{
    list = myList;
}

void Permuter::Next()
{
    int curr = myList.size()-1;  // rightmost index
    while (true)
    {   int beforecurr = curr-1;
        if (myList[beforecurr] < myList[curr])
        {   // find rightmost entry that's larger than beforecurr
            // we know that curr is larger, so loop must terminate
            int lastBig = myList.size()-1;
            while (! (myList[beforecurr] < myList[lastBig]) )
            {   lastBig--;
            }
            Swap(beforecurr,lastBig);
            Reverse(curr,myList.size()-1);
            break; // out of outer while
        } 
        curr--;
        if (curr == 0)     // it's sorted, so reverse and keep going
        {   Reverse(0,myList.size()-1);
            break; // out of outer while
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -