Здравствуйте 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