Re: Минимизация числа строк Квайном-Мак Класски
От: Ну нету Израиль  
Дата: 19.03.02 10:26
Оценка: 19 (2)
Здравствуйте Nikulina, Вы писали:

N>Есть табличка 10*10. Заполняется случайным образом. Три состояния: 0, 1, и галочка . Требуется отобрать строчки таким образом, чтобы в каждом столбце была бы по крайней мере одна галочка, а число строк было минимальным.

N>Предположительно "6-ой пункт метода Квайна-Мак Класски"

Предлагаю вариант , находящий решение за 2^10-1 сравнений

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

const int Size=10;
const int Full = (1<<Size) - 1;
int T[Size];

void Check(int *A, int maxLevel)
{
    for(int i=0, x=0; i<=maxLevel; i++){
        x = x | T[A[i]];
    }
    if(x == Full){
        printf("Yes, Yes, Yesss !!!\n");
        for(int i=0; i<=maxLevel; i++)
            printf("%4d", A[i]);
        printf("\n");
        exit(0);
    }
}
void Permute(int *A, int Val, int Level, int maxVal, int maxLevel)
{
    for(; Val<maxVal-maxLevel+Level; Val++){
        A[Level] = Val;
        if(Level == maxLevel)    
            Check(A, maxLevel);
        else                    
            Permute(A, Val+1, Level+1, maxVal, maxLevel);
    }
}

void main()
{
    int A[Size];
// Fill table
    srand(time(NULL));
    for(int i=0; i<Size; i++){
        T[i] = rand()*rand() % (Full+1);
    }
// Output table
    for(i=0; i<Size; i++){
        printf("%2d: ", i);
        for(int j=0; j<Size; j++){
            if(T[i] & (1<<j)) printf("V");
            else              printf(".");
        }
        printf("\n");
    }
// Go !
    for(i=0; i<=Size; i++)
        Permute(A, 0, 0, Size, i);
}


Имеем:
    0123456789
    ---------- 
 0: VV.V...VV.
 1: ....V.VV..
 2: ..VV.VVV.V
 3: .V...V...V
 4: .V.VVV...V
 5: ...VV.VVVV
 6: VVVVV.VV..
 7: ...V.V....
 8: ..V.V..V..
 9: VVV..VV..V
    ----------
Yes, Yes, Yesss !!!
   5   9

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.