zoukankan      html  css  js  c++  java
  • 再论字典序

    排列下一个字典序:

    1. 从原排列后部开始,对相邻一对进行比较,若前者小于后者,标记前者下标为 j;
    2. 令 k = len - 1, k 递减,寻找到 order[ K ]  > order[  j ] (k > j) ,交换两项;
    3. 对 order[ j + 1 ]  到 order[ k ], 进行从小到大的排序就可以了。 
    代码
    #include<stdio.h>
    #include
    <string.h>
    #include
    <algorithm>
    using namespace std;
    char order[60];
    int main()
    {
    int len, i, j, k, ok;
    char c;
    while(scanf("%s",order)!=EOF)
    {
    if(order[0] == '#')
    return 0;
    len
    = strlen(order);
    ok
    = 0;
    for(i=1; i<len; i++)
    if(order[i-1] < order[i])
    {
    ok
    = 1;
    break;
    }
    if(!ok) printf("No Successor\n");
    else
    {
    for(i = len-2; i >= 0; i--)
    {
    if(order[i] < order[i+1])
    {
    j
    = i;
    for(k = len-1; k > j; k--)
    {
    if(order[k] > order[j])
    {
    c
    = order[k];
    order[k]
    = order[j];
    order[j]
    = c;
    //***********************
    sort(order+j+1,order+len);
    //***********************
    break;
    }
    }
    break;
    }
    }
    printf(
    "%s\n",order);
    }
    }
    return 0;
    }

    当然C++里对下一个字典排序是有STL的:

    不过对于STL,我的观点是:用之前必须弄明白它的原理。

    代码
    #include<stdio.h>
    #include
    <algorithm>
    using namespace std;
    int main()
    {
    int len;
    char order[60];
    while(scanf("%s", order) != EOF)
    {
    if(order[0] == '#') return 0;
    len
    = strlen(order);
    if(next_permutation(order,order+len)) printf("%s\n", order);
    else printf("No Successor\n");
    }
    return 0;
    }

    http://acm.pku.edu.cn/JudgeOnline/problem?id=1256

    the right order of letters is 'A'<'a'<'B'<'b'<...<'Z'<'z'. (初始排列)

    求全排列:

    心得:

    1. 原先错误写地写成cmp()传进去的参数为数组下标(其实应该是字符型的),导致sort()不能正常工作,而且代码写的冗杂,通过一个exist()函数来判断是否存在下一个排列(其实只要通过next()函数的返回值判断就可以了)。sort()函数和exist()函数都要调用cmp()函数,于是没想清楚,参数选错。
    2. cmp()函数通过对两个参数的大小写的判断再进行比较。

    cmp()

    代码
    bool cmp(char a, char b)
    {
    if(a >= 'A' && a <= 'Z' && b >= 'A' && b <= 'Z') return a < b;
    if(a >= 'A' && a <= 'Z' && b >= 'a' && b <= 'z') return a+32 <= b;
    if(a >= 'a' && a <= 'z' && b >= 'A' && b <= 'Z') return a < b+32;
    if(a >= 'a' && a <= 'z' && b >= 'a' && b <= 'z') return a < b;
    }

    main()内输出部分:

    sort(list, list+len, cmp);
    while(1)
    {
    printf(
    "%s\n", list);
    if(!next()) break;
    }
  • 相关阅读:
    CSS3:三个矩形,一个宽200px,其余宽相等且自适应满铺
    pidera安装node.js(树莓派)
    深入JavaScript模块化编程
    c# 多显示器设置主屏幕(Set primary screen for multiple monitors)
    c# 获取移动硬盘信息、监听移动设备的弹出与插入事件
    C# 弹出USB外接硬盘(U盘)
    log4net 自定义Appender
    Scrum 思考
    监控浏览器关闭事件
    判断地图的点是否在面内 腾讯地图
  • 原文地址:https://www.cnblogs.com/submarinex/p/1941252.html
Copyright © 2011-2022 走看看