回溯法之符号三角形测试代码

#include <stdio.h>

#define N 7

int p[N][N];
int count = 0; // num of "-"
int num_of_triangles = 0;
int num_of_plus = 0; // appropriate num of "-" in a triangle of N char in first line

int get_num_of_plus(int n)
{
    return n * (n + 1)  /  4;
}

void output()
{
    int i, j;

    for (i = 1; i <= N; i++)
    {
        for (j  = 1; j <= i - 1;  j++)
        {
            printf(" ");

        }

        for (j  =  1; j  <=  N  -  i  +  1;  j++)
        {
            if (1 == p[i][j])
            {
                printf("- ");
            }
            else
            {
                printf("+ ");
            }
        }

        printf("\n");
    }

}

void back_track(int i)
{
    int j;
    int t;

    /*  处于第i层,应该判断i - 1层的符号个数 */

    if (count  >  num_of_plus  ||  (i  *  (i  -  1)  /  2 - count)  > num_of_plus)
    {
        return;
    }

    if (i > N)
    {
        output();

        num_of_triangles++;
    }
    else
    {
        for (j  =  0; j  <  2;  j++)
        {
            p[1][i]  =  j;

            count  +=  p[1][i];

            for (t = 2; t <= i; t++)
            {
                p[t][i-t+1] = p[t-1][i-t+1] ^ p[t-1][i-t+2];
                count += p[t][i-t+1];
            }

            back_track(i+1);

            for (t = 2; t <= i; t++)
            {
                count  -=  p[t][i-t+1];
            }

            count  -=  p[1][i];

        }

    }
}


int main()
{
    num_of_plus = get_num_of_plus(N);

    back_track(1);

    printf("num_of_plus %d\n", num_of_plus);
    printf("triangle nums: %d\n", num_of_triangles);

    return 0;
}



你可能感兴趣的:(回溯法之符号三角形测试代码)