Добавил:
Tushkan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Готовые лабораторные работы (ММ) / Dmath_lab1 / impl / DMath_Lab1
.hpp// DMath_Lab1.cpp : Defines the entry point for the console application.
//
#include "List.hpp"
enum Var
{
_null = 2,
_one = 1,
_X = 3,
_zero = 0
};
#define List BDList
template<unsigned n = 16> struct Vector1
{
Var data_[n];
Vector1(){}
Vector1(char* str)
{
for(unsigned i = 0; i < n; ++i)
{
switch(str[i])
{
case '0' : data_[i] = _null; break;
case '1' : data_[i] = _one; break;
case 'x' : data_[i] = _X; break;
}
}
}
bool tryAttach(Vector1 arg) const
{
Vector1 tmp;
unsigned nullCount = 0;
for(unsigned i = 0; i < n; ++i)
{
tmp.data_[i] = static_cast<Var>(data_[i] & arg.data_[i]);
if (tmp.data_[i] == _zero)
{
++nullCount;
tmp.data_[i] = _X;
}
}
if(nullCount == 1) return true;
else return false;
}
Vector1 operator ^(Vector1 arg) const
{
Vector1 tmp;
unsigned nullCount = 0;
for(unsigned i = 0; i < n; ++i)
{
tmp.data_[i] = static_cast<Var>(data_[i] & arg.data_[i]);
if (tmp.data_[i] == _zero)
{
++nullCount;
tmp.data_[i] = _X;
}
}
if(nullCount == 1) return tmp;
else throw "Error";
}
Vector1 operator &(Vector1 arg) const
{
Vector1 tmp;
for(unsigned i = 0; i < n; ++i)
{
tmp.data_[i] = static_cast<Var>(data_[i] & arg.data_[i]);
}
return tmp;
}
bool inc(Vector1 arg) const
{
return ((*this) & arg) == arg;
}
bool operator == (Vector1 arg) const
{
for(unsigned i = 0; i < n; ++i)
{
if(data_[i] != arg.data_[i]) return false;
}
return true;
}
/*void print() const
{
for(unsigned j = 0; j < n; ++j)
{
switch(data_[j])
{
case _null: std::cout << "0"; break;
case _one: std::cout << "1"; break;
case _X: std::cout << "x"; break;
}
}
std::cout << std::endl;
} */
};
template<int n> void Run(NSD::List<Vector1<n> >& lst)
{
typedef Vector1<n> Vector;
//ввод
//lst.getLast().insertAfter(Vector("10xx01001xxxx101"));
//lst.getLast().insertAfter(Vector("0x11x1xx1x00xx01"));
//lst.getLast().insertAfter(Vector("xxxxxxxxxxxxx01x"));
bool newIteration = true;
while(newIteration)
{
newIteration = false;
for(NSD::List<Vector>::iterator i = lst.getFirst(); i && !newIteration;)
{
Vector curr = *i;
bool weryty = false;
for(NSD::List<Vector>::iterator j = lst.getFirst(); j; ++j)
{
Vector nxt = *j;
if(nxt.inc(curr) && i != j)
{
NSD::List<Vector>::iterator k = i;
++k;
i.remove();
i = k;
weryty = true;
break;
}
}
if(weryty) continue;
for(NSD::List<Vector>::iterator j = lst.getFirst(); j;)
{
Vector nxt = *j;
if(curr.inc(nxt) && i != j)
{
NSD::List<Vector>::iterator k = j;
++k;
j.remove();
j = k;
}
else ++j;
}
NSD::List<Vector>::iterator j = i;
++j;
for(; j; ++j)
{
Vector nxt = *j;
if(curr.tryAttach(nxt))
{
Vector abc = curr ^ nxt;
bool absorpted = false;
for(NSD::List<Vector>::iterator q = lst.getFirst(); q; ++q)
{
Vector dd = *q;
if(dd.inc(abc))
{
absorpted = true;;
break;
}
}
if(!absorpted)
{
lst.getFirst().insertBefore(abc);
newIteration = true;
break;
}
} //catch(...){}
}
++i;
}
}
}
int run___()
{
typedef Vector1<16> Vector;
NSD::List<Vector> lst;
//ввод
lst.getLast().insertAfter(Vector("10xx01001xxxx101"));
lst.getLast().insertAfter(Vector("0x11x1xx1x00xx01"));
lst.getLast().insertAfter(Vector("xxxxxxxxxxxxx01x"));
bool newIteration = true;
while(newIteration)
{
newIteration = false;
for(NSD::List<Vector>::iterator i = lst.getFirst(); i && !newIteration;)
{
Vector curr = *i;
bool weryty = false;
for(NSD::List<Vector>::iterator j = lst.getFirst(); j; ++j)
{
Vector nxt = *j;
if(nxt.inc(curr) && i != j)
{
NSD::List<Vector>::iterator k = i;
++k;
i.remove();
i = k;
weryty = true;
break;
}
}
if(weryty) continue;
for(NSD::List<Vector>::iterator j = lst.getFirst(); j;)
{
Vector nxt = *j;
if(curr.inc(nxt) && i != j)
{
NSD::List<Vector>::iterator k = j;
++k;
j.remove();
j = k;
}
else ++j;
}
NSD::List<Vector>::iterator j = i;
++j;
for(; j; ++j)
{
Vector nxt = *j;
try
{
Vector abc = curr ^ nxt;
bool absorpted = false;
for(NSD::List<Vector>::iterator q = lst.getFirst(); q; ++q)
{
Vector dd = *q;
if(dd.inc(abc))
{
absorpted = true;;
break;
}
}
if(!absorpted)
{
lst.getFirst().insertBefore(abc);
newIteration = true;
break;
}
} catch(...){}
}
++i;
}
}
for(NSD::List<Vector>::iterator i = lst.getFirst(); i ; ++i)
{
Vector curr = *i;
// curr.print();
}
return 0;
}