//Pileline�쐬�i2014/07/18�j
void create_pileline_01(int* VoxSize)
{
	Pileline P;
	edge E;
	CVector3d temp;
	vector<Pileline> CT;//connection
	vector<edge>  Et;//edge cost
	int count=0;
	for(int z(1); z<VoxSize[2]-1; z++)
		for(int x(1); x<VoxSize[0]-1; x++)
		{
			for(int y(1); y<VoxSize[1]-1; y++)
			{
				if(block[x][y][z].fill == false)continue;
				//###################################
				//�P�~�P�̏ꍇ
				//###################################
				if(block[x][y][z].flag == 1)
				{
					temp.Set(x,y,z);
					P.Point.push_back(temp);
					P.num=1;

					P.gravity.Clear();
					for(int i(0); i <(int)P.Point.size();i++)
						P.gravity+=P.Point[i];
					P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);
					if((zcood-1)==z)
						P.ground=true;
					if(block[x][y][z].in_surf)
						P.in_surf=true;
					CT.push_back(P);
					P.init();
					temp.Clear();
					P.Point.clear();
					P.Point.shrink_to_fit();
					block[x][y][z].BrickN=count;
					count++;
				}
				else if(block[x][y][z].flag > 1)
				{
					if(block[x][y][z].corner != 1)
						continue;

					//###################################
					//�P�~�Q�̏ꍇ
					//###################################
					if(block[x][y][z].flag == 12)
					{
						//�P�~�Q���������̏ꍇ
						if(block[x][y+1][z].flag == 12 && block[x][y][z].ID == block[x][y+1][z].ID && block[x][y+1][z].corner == 2)
						{
							for(int i(0);i<2;i++){
								temp.Set(x,y+i,z);
								P.Point.push_back(temp);
								block[x][y+i][z].BrickN=count;
							}
							P.num=2;

							P.gravity.Clear();
							for(int i(0); i <(int)P.Point.size();i++)
								P.gravity+=P.Point[i];
							P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);
							if((zcood-1)==z)
								P.ground=true;
							if(block[x][y][z].in_surf)
								P.in_surf=true;
							CT.push_back(P);
							P.init();
							temp.Clear();				
							P.Point.clear();
							P.Point.shrink_to_fit();
							count++;
							continue;
						}
						//�P�~�Q���������̏ꍇ
						if(block[x+1][y][z].flag == 12 && block[x][y][z].ID == block[x+1][y][z].ID && block[x+1][y][z].corner == 2)
						{
							for(int i(0);i<2;i++){
								temp.Set( x+i , y ,z );
								P.Point.push_back(temp);
								block[x+i][y][z].BrickN=count;
							}
							P.num=2;

							P.gravity.Clear();
							for(int i(0); i <(int)P.Point.size();i++)
								P.gravity+=P.Point[i];
							P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);

							if((zcood-1)==z)
								P.ground=true;
							if(block[x][y][z].in_surf)
								P.in_surf=true;
							CT.push_back(P);
							P.init();
							temp.Clear();
							P.Point.clear();
							P.Point.shrink_to_fit();
							count++;
						}
					}
					//###################################
					//�P�~�R�̏ꍇ
					//###################################
					//else if(block[x][y][z].flag == 13 && block[x][y][z].corner == 1)
					else if(block[x][y][z].flag == 13)
					{
						//�P�~�R���������̏ꍇ
						if(y+2 < VoxSize[1])
						{
							if(block[x][y+2][z].flag == 13 && block[x][y][z].ID == block[x][y+2][z].ID && block[x][y+2][z].corner == 2)
							{
								for(int i(0);i<3;i++){
									temp.Set( x , y+i ,z );
									P.Point.push_back(temp);
									block[x][y+i][z].BrickN=count;
								}
								P.num=3;

								P.gravity.Clear();
								for(int i(0); i <(int)P.Point.size();i++)
									P.gravity+=P.Point[i];
								P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);

								if((zcood-1)==z)
									P.ground=true;
								if(block[x][y][z].in_surf)
									P.in_surf=true;
								CT.push_back(P);
								P.init();
								temp.Clear();
								P.Point.clear();
								P.Point.shrink_to_fit();
								count++;	
								continue;
							}
						}
						//�P�~�R���������̏ꍇ
						if(x+2 < VoxSize[0])
						{
							if(block[x+2][y][z].flag == 13 && block[x][y][z].ID == block[x+2][y][z].ID && block[x+2][y][z].corner == 2)
							{
								for(int i(0);i<3;i++){
									temp.Set( x+i , y ,z );
									P.Point.push_back(temp);
									block[x+i][y][z].BrickN=count;
								}
								P.num=3;

								P.gravity.Clear();
								for(int i(0); i <(int)P.Point.size();i++)
									P.gravity+=P.Point[i];
								P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);

								if((zcood-1)==z)
									P.ground=true;
								if(block[x][y][z].in_surf)
									P.in_surf=true;
								CT.push_back(P);
								P.init();
								temp.Clear();
								P.Point.clear();
								P.Point.shrink_to_fit();
								count++;
							}
						}
					}

					//###################################
					//�P�~�S�̏ꍇ
					//###################################
					//else if(block[x][y][z].flag == 14 && block[x][y][z].corner == 1)
					else if(block[x][y][z].flag == 14)
					{
						//�P�~�S���������̏ꍇ
						if(y+3 < VoxSize[1])
						{
							if(block[x][y+3][z].flag == 14 && block[x][y][z].ID == block[x][y+3][z].ID && block[x][y+3][z].corner == 2)
							{
								for(int i(0);i<4;i++){
									temp.Set( x , y+i ,z );
									P.Point.push_back(temp);
									block[x][y+i][z].BrickN=count;
								}
								P.num=4;

								P.gravity.Clear();
								for(int i(0); i <(int)P.Point.size();i++)
									P.gravity+=P.Point[i];
								P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);

								if((zcood-1)==z)
									P.ground=true;
								if(block[x][y][z].in_surf)
									P.in_surf=true;
								CT.push_back(P);
								P.init();
								temp.Clear();
								P.Point.clear();
								P.Point.shrink_to_fit();
								count++;
								continue;

							}
						}
						//�P�~�S���������̏ꍇ
						if(x+3 < VoxSize[0])
						{
							if(block[x+3][y][z].flag == 14 && block[x][y][z].ID == block[x+3][y][z].ID && block[x+3][y][z].corner == 2)
							{
								for(int i(0);i<4;i++){
									temp.Set( x+i , y ,z );
									P.Point.push_back(temp);
									block[x+i][y][z].BrickN=count;
								}
								P.num=4;

								P.gravity.Clear();
								for(int i(0); i <(int)P.Point.size();i++)
									P.gravity+=P.Point[i];
								P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);

								if((zcood-1)==z)
									P.ground=true;
								if(block[x][y][z].in_surf)
									P.in_surf=true;
								CT.push_back(P);
								P.init();
								temp.Clear();
								P.Point.clear();
								P.Point.shrink_to_fit();
								count++;
							}
						}
					}
					//###################################
					//�Q�~�Q�̏ꍇ
					//###################################
					//else if(block[x][y][z].flag == 22 && block[x][y][z].corner == 1)
					else if(block[x][y][z].flag == 22)
					{
						if(block[x+1][y+1][z].flag == 22 && block[x][y][z].ID == block[x+1][y+1][z].ID && block[x+1][y+1][z].corner == 2)
						{
							for(int i(0) ; i<2;++i)
								for(int j(0);j<2;++j){
									temp.Set(x+i,y+j,z);
									P.Point.push_back(temp);
									block[x+i][y+j][z].BrickN=count;
								}
								P.num=4;

								P.gravity.Clear();
								for(int i(0); i <(int)P.Point.size();i++)
									P.gravity+=P.Point[i];
								P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);

								if((zcood-1)==z)
									P.ground=true;
								if(block[x][y][z].in_surf)
									P.in_surf=true;
								CT.push_back(P);
								P.init();
								temp.Clear();
								P.Point.clear();
								P.Point.shrink_to_fit();
								count++;
						}
					}
					//###################################
					//�Q�~�R�̏ꍇ
					//###################################
					//else if(block[x][y][z].flag == 23 && block[x][y][z].corner == 1)
					else if(block[x][y][z].flag == 23)
					{
						//�Q�~�R���������̏ꍇ
						if(y+2 < VoxSize[1])
						{
							if(block[x+1][y+2][z].flag == 23 && block[x][y][z].ID == block[x+1][y+2][z].ID && block[x+1][y+2][z].corner == 2)
							{
								for(int i(0) ; i<2;++i)
									for(int j(0);j<3;++j){
										temp.Set(x+i,y+j,z);
										P.Point.push_back(temp);
										block[x+i][y+j][z].BrickN=count;
									}
									P.num=6;

									P.gravity.Clear();
									for(int i(0); i <(int)P.Point.size();i++)
										P.gravity+=P.Point[i];
									P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);

									if((zcood-1)==z)
										P.ground=true;
									if(block[x][y][z].in_surf)
										P.in_surf=true;
									CT.push_back(P);
									P.init();
									temp.Clear();
									P.Point.clear();
									P.Point.shrink_to_fit();
									count++;
									continue;
							}
						}
						//�Q�~�R���������̏ꍇ
						if(x+2 < VoxSize[0])
						{
							if(block[x+2][y+1][z].flag == 23 && block[x][y][z].ID == block[x+2][y+1][z].ID && block[x+2][y+1][z].corner == 2)
							{
								for(int i(0) ; i<3;++i)
									for(int j(0);j<2;++j){
										temp.Set(x+i,y+j,z);
										P.Point.push_back(temp);
										block[x+i][y+j][z].BrickN=count;
									}
									P.num=6;
									P.gravity.Clear();

									for(int i(0); i <(int)P.Point.size();i++)
										P.gravity+=P.Point[i];
									P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);

									if((zcood-1)==z)
										P.ground=true;
									if(block[x][y][z].in_surf)
										P.in_surf=true;
									CT.push_back(P);
									P.init();
									temp.Clear();
									P.Point.clear();
									P.Point.shrink_to_fit();
									count++;
							}
						}
					}
					//###################################
					//�Q�~�S�̏ꍇ
					//###################################
					//else if(block[x][y][z].flag == 24 && block[x][y][z].corner == 1)
					else if(block[x][y][z].flag == 24)
					{
						//�Q�~�S���������̏ꍇ
						if(y+3 < VoxSize[1])
						{
							if(block[x+1][y+3][z].flag == 24 && block[x][y][z].ID == block[x+1][y+3][z].ID && block[x+1][y+3][z].corner == 2)
							{
								for(int i(0) ; i<2;++i)
									for(int j(0);j<4;++j){
										temp.Set(x+i,y+j,z);
										block[x+i][y+j][z].BrickN=count;
										P.Point.push_back(temp);
									}
									P.num=8;
									P.gravity.Clear();

									for(int i(0); i <(int)P.Point.size();i++)
										P.gravity+=P.Point[i];
									P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);

									if((zcood-1)==z)
										P.ground=true;
									if(block[x][y][z].in_surf)
										P.in_surf=true;
									CT.push_back(P);
									P.init();
									temp.Clear();
									P.Point.clear();
									P.Point.shrink_to_fit();
									count++;
									continue;
							}
						}
						//�Q�~�S���������̏ꍇ
						if(x+3 < VoxSize[0])
						{
							if(block[x+3][y+1][z].flag == 24 && block[x][y][z].ID == block[x+3][y+1][z].ID && block[x+3][y+1][z].corner == 2)
							{
								for(int i(0) ; i<4;++i)
									for(int j(0);j<2;++j){
										temp.Set(x+i,y+j,z);
										P.Point.push_back(temp);
										block[x+i][y+j][z].BrickN=count;
									}
									P.num=8;
									P.gravity.Clear();

									for(int i(0); i <(int)P.Point.size();i++)
										P.gravity+=P.Point[i];
									P.gravity.Set(P.gravity.x/P.num , P.gravity.y/P.num , P.gravity.z/P.num);

									if((zcood-1)==z)
										P.ground=true;
									if(block[x][y][z].in_surf)
										P.in_surf=true;
									CT.push_back(P);
									P.init();
									temp.Clear();
									P.Point.clear();
									P.Point.shrink_to_fit();
									count++;
							}
						}
					}
				}
			}
		}

		//for(int z(1); z<VoxSize[2]-1; z++)
		//	for(int x(1); x<VoxSize[0]-1; x++)
		//	{
		//		for(int y(1); y<VoxSize[1]-1; y++)
		//		{
		//			if(block[x][y][z].fill == false)continue;
		//
		//		
		//		
		//		
		//		}
		//	}



	vector<int> Nc;
	//�ӂƃR�X�g�v�Z
	for(int i (0); i < (int) CT.size();++i){
		for(int c(0); c< CT[i].num; c++){

			if(block[(int)CT[i].Point[c].x][(int)CT[i].Point[c].y][(int)CT[i].Point[c].z+1].fill){
				Nc.push_back(block[(int)CT[i].Point[c].x][(int)CT[i].Point[c].y][(int)CT[i].Point[c].z+1].BrickN);
			if(block[(int)CT[i].Point[c].x][(int)CT[i].Point[c].y][(int)CT[i].Point[c].z+1].BrickN==0)
				cout<<"���������̂�   "<<(int)CT[i].Point[c].z<<"  "<<block[(int)CT[i].Point[c].x][(int)CT[i].Point[c].y][(int)CT[i].Point[c].z+1].flag<<endl;
			}
		}

		//int number=0;
		//cout<<endl;
		//for(int a(0); a <(int) Nc.size(); a++){
		//cout<<Nc[a]<<"   ";
		//	if(Nc[a]==-10)continue;
		//	int count=1;
		//	number=Nc[a];
		//	for(int k = a+1; k <(int) Nc.size();k++){
		//		if(Nc[k] == number){
		//			count++;
		//			Nc[k]=-10;
		//		}
		//		E.cost=count;
		//		E.PN[0]=i;
		//		E.PN[1]=number;
		//		Et.push_back(E);
		//									}
		//							}
		//Nc.clear();
		//Nc.shrink_to_fit();
		
		//�����ԍ����ǂ������邩
		int num=0;
		int cou=0;
		for(int a(0) ; a < (int)Nc.size();a++){
			if(Nc[a]<0)continue;
			cou=0;
		num=Nc[a];
		for(int k(a+1); k < (int)Nc.size(); k++){
			if(Nc[k]==num){
				cou++;
				Nc[k]=-10;
			}
		}
				E.cost=cou+1;
				E.PN[0]=i;
				E.PN[1]=num;
				Et.push_back(E);
		}
		Nc.clear();
		Nc.shrink_to_fit();
	}

	ofstream Ffout("Pileline_gravity01.txt");
	Ffout<<CT.size()<<"  "<<Et.size()<<endl;
	for(int i (0); i < (int) CT.size();++i){
		//CT[i].gravity.Print();
		//Ffout<<CT[i].gravity.x<<"   "<<CT[i].gravity.y<<"   "<<CT[i].gravity.z*1.2<<endl;
		//LEGO�d�l�ɕύX
		//Ffout<<CT[i].gravity.y<<"   "<<VoxSize[2]-CT[i].gravity.z<<"   "<<(VoxSize[0]-CT[i].gravity.x)*1.2<<endl;
		Ffout<<CT[i].gravity.x<<"   "<<CT[i].gravity.y<<"   "<<CT[i].gravity.z*1.2<<"  "<<CT[i].num<<"  "<<CT[i].ground
			<<"  "<<CT[i].in_surf<<endl;
	}
	for(int i(0) ; i < (int)Et.size(); i++)
	{
		Ffout<<Et[i].PN[0]<<" "<<Et[i].PN[1]<<" "<<Et[i].cost<<endl;

	}
	Ffout.close();
	CT.clear();
	CT.shrink_to_fit();
	
	
	//Pileline�A���S���Y�����O���̒���z�u����
	//���I�������A����
	int ID,flag ,Zcoord,Xcoord,Ycoord;
	//double Zcoord,Xcoord,Ycoord;
	string line;
	stringstream ssline;
	fstream fin("Prop.txt");
	for(int i (0) ; i < 10 ; i++){
	getline(fin , line);
	ssline.str(line);
	ssline>>Xcoord>>Ycoord>>Zcoord;
	ssline.clear();
	//�R�����z��ɑΉ������A�������
	ID=block[Xcoord][Ycoord][Zcoord].ID;
	flag=block[Xcoord][Ycoord][Zcoord].flag;

		//for(int j = Zcoord+1; j < zcood ; j++){
			if(flag==24){
				if(block[Xcoord-2][(int)(Ycoord)-1][Zcoord].ID==ID&&
					block[Xcoord-2][(int)(Ycoord)-1][Zcoord].flag==flag&&
					block[Xcoord-2][(int)(Ycoord)-1][Zcoord].corner==1){
						for(int j = Zcoord+1; j < zcood ; j++){
							ID24++;change_bricks(block,Xcoord-2,Ycoord-1,j,4,2,ID24,flag);
						}
				}
				else if(block[Xcoord-1][Ycoord-2][Zcoord].ID==ID&&
						  block[Xcoord-1][Ycoord-2][Zcoord].flag==flag&&
						  block[Xcoord-1][Ycoord-2][Zcoord].corner==1){
						for(int j = Zcoord+1; j < zcood ; j++){
							ID24++;change_bricks(block,Xcoord-1,Ycoord-2,j,2,4,ID24,flag);
						}
				}
			}
			
			else if(flag==23){
				 if(block[Xcoord][Ycoord+1][Zcoord].ID==ID&&
					block[Xcoord][Ycoord+1][Zcoord].flag==flag){
						for(int j = Zcoord+1; j < zcood ; j++){
							ID23++;change_bricks(block,Xcoord-1,Ycoord-1,j,3,2,ID23,flag);
						}
				}
				else {
						for(int j = Zcoord+1; j < zcood ; j++){
							ID23++;change_bricks(block,Xcoord-1,Ycoord-1,j,2,3,ID23,flag);
						}
				}
			}
			else if(flag==22){
				for(int j = Zcoord+1; j < zcood ; j++){
					ID22++;change_bricks(block,Xcoord-1,Ycoord-1,j,2,2,ID22,flag);
	
				}
			}
			else if(flag==14){
				if(block[Xcoord-2][Ycoord][Zcoord].ID==ID&&
				   block[Xcoord-2][Ycoord][Zcoord].flag==flag){
						for(int j = Zcoord+1; j < zcood ; j++){
							ID14++;change_bricks(block,Xcoord-2,Ycoord,j,4,1,ID14,flag);
						}
				}
				else {
					for(int j = Zcoord+1; j < zcood ; j++){
						ID14++;change_bricks(block,Xcoord,Ycoord-2,j,1,4,ID14,flag);
					}
				}
			}
			else if(flag==13){
				if(block[Xcoord-1][Ycoord][Zcoord].ID==ID&&
				   block[Xcoord-1][Ycoord][Zcoord].flag==flag){
						for(int j = Zcoord+1; j < zcood ; j++){
							ID13++;change_bricks(block,Xcoord-1,Ycoord,j,3,1,ID13,flag);
						}
				}
				else {
					for(int j = Zcoord+1; j < zcood ; j++){
						ID14++;change_bricks(block,Xcoord,Ycoord-1,j,1,3,ID13,flag);
					}
				}
			}
			else if(flag==12){
				if(block[Xcoord-1][Ycoord][Zcoord].ID==ID&&
				   block[Xcoord-1][Ycoord][Zcoord].flag==flag){
						for(int j = Zcoord+1; j < zcood ; j++){
							ID12++;change_bricks(block,Xcoord-1,Ycoord,j,2,1,ID12,flag);
						}
				}
				else {
					for(int j = Zcoord+1; j < zcood ; j++){
						ID12++;change_bricks(block,Xcoord,Ycoord-1,j,1,2,ID12,flag);
					}
				}
			}
			else if(flag==1){
				for(int j = Zcoord+1; j < zcood ; j++){
					change_bricks(block,Xcoord,Ycoord,j,1,1,0,flag);
				}
			}
		//}
	}
}