【离散数学】编程练习:消解算法

实现功能:消解算法
输入:合式公式 A 的合取范式
输出:当 A 是可满足时,回答“YES ”;否则回答“NO”。

在这里插入图片描述

#include <stdio.h>
#include <string.h>

#define N 50

int Resolvent[N][26];

int total_num, res_num, line;

void convert_form(char str[])

{

    total_num = res_num = -1;
    line = 0;

    int i;

    memset(Resolvent, 0, sizeof(Resolvent));

    for (i = 0; i < strlen(str); i++)

    {

        if (str[i] >= 'a' && str[i] <= 'z')
            Resolvent[line][str[i] - 'a'] = 1;

        else if (str[i] == '&')
            line++;

        else if (str[i] == '!')
            Resolvent[line][str[++i] - 'a'] = 2;
    }
}

bool is_same(int p[], int q[])

{

    for (int i = 0; i < 26; i++)

        if (p[i] != q[i])
            return false;

    return true;
}

bool not_repeated(int q[])

{

    for (int i = 0; i <= line; i++)

        if (is_same(Resolvent[i], q))
            return false;

    return true;
}

bool res(int p[], int q[])

{

    int reg_res = 0;

    int pos_res = 0;

    for (int i = 0; i < 26; i++)

    {

        if (!p[i] && !q[i])
            continue;

        if ((p[i] + q[i]) == 3)
            pos_res++;

        else
            reg_res++;
    }

    if (pos_res != 1)
        return true;

    if (!reg_res)
        return false;

    int c[30];

    for (int i = 0; i < 26; i++)

    {

        if ((!p[i] && !q[i]) || (p[i] + q[i] == 3))
            c[i] = 0;

        else if (p[i] == 1 || q[i] == 1)
            c[i] = 1;

        else
            c[i] = 2;
    }

    if (not_repeated(c))

    {

        line++;

        for (int i = 0; i < 26; i++)
            Resolvent[line][i] = c[i];
    }

    return true;
}

int main()

{

    char str[N];

    scanf("%s", str);

    convert_form(str);

    int i, j;

    /*
    printf("%d %d %d\n", total_num, res_num, line);

    for (i = 0; i < line; i++)
    {
        for (j = 0; j < 26; j++)
            printf("%d ", Resolvent[i][j]);
        printf("\n");
    } 
    */

    while (line > res_num)

    {

        total_num = res_num;
        res_num = line;

        for (i = 0; i <= total_num; i++)

            for (j = total_num + 1; j <= res_num; j++)

                if (!res(Resolvent[i], Resolvent[j]))

                {
                    printf("NO\n");

                    return 0;
                }

        for (int i = total_num + 1; i <= res_num; i++)

            for (int j = i + 1; j <= res_num; j++)

                if (!res(Resolvent[i], Resolvent[j]))

                {
                    printf("NO\n");

                    return 0;
                }
    }

    printf("YES\n");

    return 0;
}
发布了58 篇原创文章 · 获赞 117 · 访问量 6818

猜你喜欢

转载自blog.csdn.net/weixin_44936889/article/details/103708902