Использование двунаправленного списка в задаче размещения костей домино

Последовательность камней домино представить в виде двунаправленного списка, заполненного произвольным образом. Исключить все дубли, вывести результат.

АЛГОРИТМ:
1.Создать какой-нибудь упорядоченный список костей домино
2.Взять случайно фишку и поставить в конце, брать случайно фишки из тех что до нее и ставить в конце пока фишка не станет первой.
3.Перебрав фишки удалить те у которых равны поля.

#include <STDIO.H>
#include <IOSTREAM.H>
#include <CONIO.H>
#include <STDLIB.H>
#include <time.h>
 
class Dlists
{
	public:
		Dlists();
		Dlists& set(unsigned int,unsigned int,unsigned int =count);//добавляет элемент
		Dlists& del(unsigned int =count-1);		           //удаляет элемент
		unsigned int getUp(unsigned int =0) const; //читает 1 часть элемента списка
		unsigned int getDown(unsigned int =0) const;//читает 2 часть элемента списка
		unsigned int getcount() const;              //количество элементов списка
		~Dlists();
	private:
		struct dlist{
			dlist* previous;
			int UpN;
			int DownN;
			dlist* next;
		};
		dlist *Head;            //указывает на первый элемент из списка
		unsigned int count;     //содержит количество элементов списка
};//end class Dlists
 
//----------------------------------------------------------------------------
 
//Dlists function
Dlists::Dlists(){
	Head=0;
        count=0;
}
//--------------------------------------
Dlists& Dlists::set(unsigned int Up,unsigned int Down,unsigned int N){
	if(Up>6)  return *this;
	if(Down>6)  return *this;
	if( N > count ) return *this;
 
	if(N==0){
		if(!count ){
			dlist* iX=new dlist;
			Head=iX;
			iX->next=iX;
			iX->UpN=Up;
			iX->DownN=Down;
			iX->previous=iX;
			count++;
			return *this;
		}else{
			dlist* iX=new dlist;
			iX->next=Head;
			iX->UpN=Up;
			iX->DownN=Down;
			iX->previous=(Head->previous);
			(Head->previous)->next=iX;
			Head->previous=iX;
			Head=iX;
			count++;
			return *this;
		};
	};
 
	dlist* lX;
	lX=Head;
	if(count/2<=N){
       for(unsigned int i=N;i>=2;i--){
          lX=(lX->next);
	   };
    }else{
       for(unsigned int i=count;i>=N;i--){
          lX=(lX->previous);
	   };
    };
	dlist*iX=new dlist;
	iX->UpN=Up;
	iX->DownN=Down;
	iX->next=(lX->next);
	(lX->next)->previous=iX;
	iX->previous=lX;
	lX->next=iX;
	count++;
	return *this;
}//end set()
//--------------------------------------
Dlists& Dlists::del(unsigned int N){
	if( N >= count ) return *this;
 
	if(N==0){
		if(1==count){
			delete Head;
			Head=NULL;
		}else{
			dlist* lX;
			lX=Head;
			Head=(Head->next);
			Head->previous=(lX->previous);
			(lX->previous)->next=Head;
			delete lX;
		};
		count--;
		return *this;
	};
 
	dlist* lX;
	lX=Head;
	if(count/2<=N){
       for(unsigned int i=N;i>=2;i--){
          lX=(lX->next);
	   };
    }else{
       for(unsigned int i=count;i>=N;i--){
          lX=(lX->previous);
	   };
    };
	dlist* lY;
	lY=(lX->next);
	lX->next=(lY->next);
	(lY->next)->previous=lX;
	delete lY;
	count--;
	return *this;
}//end del()
//--------------------------------------
unsigned int Dlists::getUp(unsigned int N) const{
	if( N >= count ) return 0;
	dlist* lX;
	lX=Head;
	if(count/2<=N){
       for(unsigned int i=N;i>=1;i--){
          lX=(lX->next);
	   };
    }else{
       for(unsigned int i=count;i>N;i--){
          lX=(lX->previous);
	   };
    };
	return (lX->UpN);
}//end get()
//--------------------------------------
unsigned int Dlists::getDown(unsigned int N) const{
	if( N >= count ) return 0;
	dlist* lX;
	lX=Head;
	if(count/2<=N){
       for(unsigned int i=N;i>=1;i--){
          lX=(lX->next);
	   };
    }else{
       for(unsigned int i=count;i>N;i--){
          lX=(lX->previous);
	   };
    };
	return (lX->DownN);
}//end get()
//--------------------------------------
unsigned int Dlists::getcount() const{
	return count;
}
//--------------------------------------
Dlists::~Dlists(){
	if(count!=0){
		for(unsigned int i=count;i>0;i--)del();
	};
}
//end DLists function--------------------
 
int main(){//----------------------------------------------------------
 
Dlists domino;
unsigned int i,j,N;
 
for(j=0;j<=6;j++){      //Создадим кости домино
	for(i=0;i<=6;i++)	domino.set(i,j);
};
 
N=domino.getcount();    //напечатаем кости
for(i=0;i<N;i++) cout<<domino.getUp(i);
cout<<"\n";
for(i=0;i<N;i++) cout<<domino.getDown(i);
cout<<"\n";
cout<<N<<" fishek domino\n\n";
 
time_t t;               //Перемешаем кости
srand((unsigned) time(&t));
for(i=0;i<N;i++){
	j=rand()%(N-i);
	domino.set(domino.getUp(j),domino.getDown(j));
	domino.del(j);
};
 
for(i=0;i<N;i++) cout<<domino.getUp(i);//напечатаем кости
cout<<"\n";
for(i=0;i<N;i++) cout<<domino.getDown(i);
cout<<"\n";
cout<<N<<" fishek domino v sluchajnom porjadke\n\n";
 
for(i=0;i<N;i++){       //удалим дубли
	if(domino.getUp(i)==domino.getDown(i)){;
		domino.del(i);
		i--;
		N--;
	};
};
 
for(i=0;i<N;i++) cout<<domino.getUp(i);//напечатаем кости
cout<<"\n";
for(i=0;i<N;i++) cout<<domino.getDown(i);
cout<<"\n";
cout<<N<<" fishki domino bez dublej\n";
getch();
return 1;
};//end main----------------------------------------------------------------

Ключевые слова: 
двунаправленные списки домино
ВложениеРазмер
Domino.zip140.75 кб