Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
15
Добавлен:
28.06.2014
Размер:
5.17 Кб
Скачать
// 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;
}





Соседние файлы в папке impl