#include "code\Deployment\Deployment.txt"

//----------------------------------------------------------------------------------------------
void main(){
	SYS=(map)0;
	Deployment(&SYS,"стартовое состояние",{{6,5,4,3,2,1},{},{},{}});
	Deployment(&SYS,"метод текстового описания состояния","XtoString");
	Deployment(&SYS,"разварачивать до первого конечного состояния");
	Deployment(&SYS,"признак конечного состояния","gotovo");
	Deployment(&SYS,"методы изменения состояния",{"perebros"});
	Deployment(&SYS,"подготовка параметров к методам изменения состояния",{"paramsForPerebros"});
	Deployment(&SYS,"включить отображение новых состояний"); //
	Deployment(&SYS,"имя модели","Xenoi4x");
	//Deployment(&SYS,"время ожидания",60*15);
	Deployment(&SYS,"сохранять через каждых секунд",60*20);
	Deployment(&SYS,"номер версии",6);
	Deployment(&SYS,"файл задания",getThisFileName());

	if(!Deployment(&SYS,"развернуть систему")){
		trace("Превышено время ожидания.");
		trace("Для продолжения разварачивания системы запустите программу повторно.");
		getstring();
		return;
		}
	if(Deployment(&SYS,"развёртывание толькочто произошло")){
		trace("Жми ЕНТЕР для выхода.");
		getstring();
		return;
		}
	trace("Загрузка развёрнутой системы игровых состояний завершена.");
	//n=6;//Deployment(&SYS,"вычислить количество всех кратчайших путей");

	//ways=Deployment(&SYS,"взять все кратчайшие пути к конечному состоянию");
	ways=
		{{0,1,4,10,26,58,93,168,276,418,671,998,1363,1907,2767,2818,2839,2849},
		{0,1,5,13,32,66,109,198,312,482,772,1112,1518,2190,2796,2828,2839,2849},
		{0,2,6,16,35,68,93,168,276,418,671,998,1363,1907,2767,2818,2839,2849},
		{0,2,6,16,35,58,93,168,276,418,671,998,1363,1907,2767,2818,2839,2849},
		{0,3,8,20,45,78,109,198,312,482,772,1112,1518,2190,2796,2828,2839,2849},
		{0,3,8,20,45,66,109,198,312,482,772,1112,1518,2190,2796,2828,2839,2849}};

	n=ways.size();
	trace("Количество возможных путей: "+n);
	for(i=0;i<n;++i){
		Deployment(&SYS,"распечатка состояний по заданному пути",ways[i]);
		trace();
		}
	trace();


	trace(
		"На разворачивание системы ушло времени: " +
		Deployment(&SYS,"сколько времени ушло на разворачивание?")
		);

	getstring();
}


// Метод для подготовки параметров к методу изменения состояния
var paramsForPerebros(S){
	v={};
/*
	if((*S)[1].size()<4)return v;
	if((*S)[1][0]!=6)return v;
	if((*S)[1][1]!=5)return v;
	if((*S)[1][2]!=4)return v;
	if((*S)[1][3]!=3)return v;
*/
	for(i=0;i<S->size();++i){
		iz=&(*S)[i];
		if(!iz->size())continue;
		for(t=0;t<S->size();++t)if(i!=t){
			ok=0;
			kuda=&(*S)[t];
			if(!kuda->size())ok=1;else if(kuda->end()>iz->end())ok=1;
			if(ok)v.push({i,t});
			}
		}
	return v;
}


// методы изменения состояния
void perebros(S,iz,kuda){
	x=(*S)[iz].pop();
	(*S)[kuda].push(x);
}


// Вернет 1, когда цель достигнута
bool gotovo(S){
	return (*S)[1]=={6,5,4,3,2,1};
}


// Вернёт строку, по которой видно положение фишок.
string XtoString(S){
	str="";
	for(i=0;i<S->size();++i){
		if(i)str+="|";
		ss="";
		for(t=0;t<(*S)[i].size();++t)ss+=(*S)[i][t];
		str+=ss.rovno(6);
		}
	return str;
}
