[ create a new paste ] login | about

Link: http://codepad.org/3u8eLcar    [ raw code | output | fork ]

C, pasted on Dec 2:
#include <stdbool.h>
#include <stdio.h>

/**
 * 根据当前的序列和 n,得到下一个序列。
 * 对这个函数来说,第一个序列是 1,-1 交错状态,
 * 最后一个序列是前面全是 1,后面全是 -1。
 *
 * @param ar 当前序列值,必须有 2n 项
 * @param n
 * @return true若下一个序列存在,false若当前已经是最后一个序列
 */
bool nextSeq(int ar[], int n)
{
    int sm1, s1;
    int i = 2 * n - 1;
    while (ar[i] == -1) // 寻找末尾连续的 -1
    {
        i--;
    }
    sm1 = 2 * n - i;
    while ((ar[i] == 1)&&(i >= 0)) // 寻找 -1 之后连续的 1
    {
        i--;
    }
    if (i < 0)
    {
        return false;
    }
    s1 = 2 * n - 1 - i - sm1;
    ar[i] = 1; // 将这个 -1 改成 1
    i++;
    int j;
    // 填充剩下的
    for (j = sm1 - s1; j > 0; j--)
    {
        ar[i] = -1;
        i++;
    }
    for (j = s1; j > 0; j--)
    {
        ar[i] = 1;
        ar[i + 1] = -1;
        i += 2;
    }
    return true;
}

int main(int argc, char *argv[])
{
    int n = 4;
    int ar[2 * n];
    int i;
    int count = 0;
    for (i = 0; i < n; i++)
    {
        ar[2 * i] = 1;
        ar[2 * i + 1] = -1;
    }
    do
    {
        for (i = 0; i < 2 * n; i++)
        {
            printf("%d ", ar[i]);
        }
        printf("\n");
        count++;
    } while(nextSeq(ar, n));
    printf("count: %d\n", count);
    return 0;
}


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1 -1 1 -1 1 -1 1 -1 
1 -1 1 -1 1 1 -1 -1 
1 -1 1 1 -1 -1 1 -1 
1 -1 1 1 -1 1 -1 -1 
1 -1 1 1 1 -1 -1 -1 
1 1 -1 -1 1 -1 1 -1 
1 1 -1 -1 1 1 -1 -1 
1 1 -1 1 -1 -1 1 -1 
1 1 -1 1 -1 1 -1 -1 
1 1 -1 1 1 -1 -1 -1 
1 1 1 -1 -1 -1 1 -1 
1 1 1 -1 -1 1 -1 -1 
1 1 1 -1 1 -1 -1 -1 
1 1 1 1 -1 -1 -1 -1 
count: 14


Create a new paste based on this one


Comments: