字典序问题

原创 2016年05月31日 12:40:45
#include <string>
#include <iostream>
#include <cstring>
using namespace std;
class permu {
    private:
        int sort[99999];
        int size;
    public:
    permu() {
        memset(sort, 0, sizeof(sort));
        size = 0;
    };
    permu(int n) {
        memset(sort, 0, sizeof(sort));
        for (int i = 0; i < n; i++) {
            sort[i] = i;
        }
        size = n;
    }
    permu(const permu& other) {
        memset(sort, 0, sizeof(sort));
        for (int i = 0; i < other.size; i++) {
            sort[i] = other.sort[i];
        }
        size = other.size;
    }
    void turn (int n, int m) {
        int temp = sort[n];
        sort[n] = sort[m];
        sort[m] = temp;
    }
    void preper() {
        if (size == 2) {
            turn(0,1);
            return;
        }
        bool isfin = 1;
        int i, j;
        for (i = 0; i < size - 1; i++) {  // Judge if finished
            if (sort[i] > sort[i + 1]) {
                isfin = 0;
                break;
            }
        }
        if (!isfin) {
        for (i = size - 1; i >= 0; i--) {
            if (sort[i] < sort[i-1]) {
                i--;
                break;
            }
        }
        for (j = i; j <= size-1; j++) {
            if (sort[j] > sort[i]) {
                j--;
                break;
            }
            if (j == size-1) {
            break;
            }
        }
        turn(i, j);
        reverse(i+1, size - 1);
    } else {
        reverse(0, size-1);
    }
    };
    inline permu operator++(int n) {
        permu temp = *this;
        nextper();
        return temp;
    };
    inline permu& operator++() {
        nextper();
        return *this;
    };
        inline permu operator--(int n) {
        permu temp = *this;
        preper();
        return temp;
    };
    inline permu& operator--() {
        preper();
        return *this;
    };
    permu& operator =(permu a) {
        size = a.size;
        for (int i = 0; i < size; ++i) {
            sort[i] = a.sort[i];
        }
        return *this;
    };
    void reverse(int m, int n) {
        if (m == n) return;
        int a[100];
        int i, j;
        for (i = n, j = 0; i >= m; i--, j++) {
            a[j] = sort[i];
        }
        for (i = m, j = 0; i <= n; i++, j++) {
            sort[i] = a[j];
        }
    };
    void nextper() {  //++
        if (size == 2) {
            turn(0,1);
            return;
        }
        bool isfin = 1;
        int i, j;
        for (i = 0; i < size - 1; i++) {  // Judge if finished
            if (sort[i] < sort[i + 1]) {
                isfin = 0;
                break;
            }
        }
        if (!isfin) {
        for (j = size - 1; j > 0; j--) {
            if (sort[j] > sort[j - 1]) {
                j--;
                break;
            }
        }
        for (i = j; i < size - 1; i++) {
            if (sort[i] < sort[j]) {
                i--;
                // the position to be turned
                break;
            }
        }
        turn(i, j);
        reverse(j+1, size - 1);
    } else {
        for (int t = 0; t < size; t++) {
            sort[t] = t;
        }
                    reverse(0, size-1);
    }
    };
    friend ostream& operator<<(ostream& out, permu & a);
};
ostream& operator<<(ostream& out, permu &a) {
    for (int i = 0; i < a.size; i++) {
        out << a.sort[i] << " ";
    }
    return out;
}

排列的字典序问题

  • 2014年09月27日 16:15
  • 2KB
  • 下载

POJ2488 A Knight's Journey(深搜DFS,字典序,骑士游历问题)

题目: A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4298...

POJ3617 字典序最小问题

Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16228   Accepted: 4...

矩形嵌套(最小字典序)—DAG动态规划问题

初步学习DAG(有向无环图dp) 问题:        描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a...

排列的字典序问题

问题描述:n个元素{1,2,……, n }有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,…,n!-1。每个排列的编号为其字典序值。例如,当n=3时,6 个不同排列的字典序值如下: 给...

POJ 3617 Best Cow Line(字典序最小问题)

Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" comp...

南邮 OJ 1202 字典序问题

字典序问题 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 267            测试通过 : 1...

字典序最小问题 前后删除加入 贪心poj3617

/*字典序最小问题: 给定长度为N的字符串S,要构造一个长度为N的字符串T。起初T是一个空串,随后反复进行下列任意操作: 1.从S的头部删除一个字符,加到T的尾部。 2.从S的尾部删除一个字符,加到T...

HDU NO.1285 确定比赛名次(拓扑排序+“字典序”问题)

写在前面 思路:这个题如果没有强调在排名正确的情况下选择字典序小的哪一组输出的话,完全就是一道简单地拓扑排序。 我们可以先找到一个入度为 0 的顶点把它推进队列,然后从这个点出发(记得更新所有顶点...
  • quper1g
  • quper1g
  • 2016年04月16日 16:34
  • 247
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字典序问题
举报原因:
原因补充:

(最多只允许输入30个字)