⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 waku.cpp

📁 用于自动商业集版的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		}
	}

	if(playoutrect!=NULL)
	{
		compositewaku* ptmpwaku = playoutrect->getwaku();
		if(!ptmpwaku->isempty())
		{
			if(onlyfull)
			{
				vector< wakuinterface* > tmpvec;
				ptmpwaku->getwakus(tmpvec);
				vector< wakuinterface* >::iterator iter = tmpvec.begin();
				vector< wakuinterface* >::iterator iterend = tmpvec.end();
				for(;iter!=iterend;++iter)
				{
					(*iter)->setpos(0,0);
					{
						if((*iter)->getmaxwidth()==12)
							++nfullcolumnleft;
						AddwakuTobags((*iter)->duplicate(),Wakus,1);
					}
				}
				delete playoutrect;
			}else{
				Pages.push_back(playoutrect);
			}
		}else{
			delete playoutrect;
		}
	}
	return true;
}

void layout::OutputResult(ofstream& out,bool beps)
{
	if(beps)
	{
		double pensiaze = 1/72.0;
		out<<"%!PS-Adobe-3.0"<<endl;
		out<<"<</PageSize [864 1152]>> setpagedevice"<<endl;
		
		out<<" 72 72 scale "<<pensiaze<<" setlinewidth "<<endl;
	}
	
	vector< layoutrect* >::iterator iter = Pages.begin();
	vector< layoutrect* >::iterator iterend = Pages.end();
	for(;iter!=iterend;++iter)
	{
		(*iter)->OutputResult(out,beps);
	}

}
int layout::TotalRemain()
{
	int nRemain = 0;
	return nRemain;
}

int layout::GetFullUsedPageNums()
{
	int nResult = 0;
	return nResult;

}

wakubag* wakubags::getwakubagatpos(int i)
{
	return pbags[i];
}

void wakubags::setwakubagatpos(wakubag* pset,int i)
{
	pbags[i] = pset;
}

void wakubags::exchangebags(wakubags& subbags,vector < pair<int,int> >& vecitem)
{
	vector < pair<int,int> >::iterator iter = vecitem.begin();
	for(;iter!=vecitem.end();++iter)
	{
		wakubag* pbag1 = NULL;
		wakubag* pbag2 = NULL;
		pbag1 = getwakubagatpos(pindex->getindex((*iter).first,(*iter).second));
		pbag2 = subbags.getwakubagatpos(pindex->getindex((*iter).first,(*iter).second));
		subbags.setwakubagatpos(pbag1,pindex->getindex((*iter).first,(*iter).second));
		setwakubagatpos(pbag2,pindex->getindex((*iter).first,(*iter).second));
	}
}


void wakubags::getsubbags(wakubags& subbags,int height)
{
	if(height<1||height>nheight)
		return;
	for(int i = 0;i<nwidth;i++)
	{
		wakubag* pbag1 = NULL;
		wakubag* pbag2 = NULL;
		pbag1 = getwakubagatpos(pindex->getindex(i+1,height));
		pbag2 = subbags.getwakubagatpos(pindex->getindex(i+1,height));
		subbags.setwakubagatpos(pbag1,pindex->getindex(i+1,height));
		setwakubagatpos(pbag2,pindex->getindex(i+1,height));
	}
}

void wakubags::addsubbags(wakubags& subbags,int height)
{
	if(height<1||height>nheight)
		return;
	for(int i = 0;i<nwidth;i++)
	{
		wakubag* pbag1 = NULL;
		wakubag* pbag2 = NULL;
		pbag2 = getwakubagatpos(pindex->getindex(i+1,height));
		pbag1 = subbags.getwakubagatpos(pindex->getindex(i+1,height));
		subbags.setwakubagatpos(pbag2,pindex->getindex(i+1,height));
		setwakubagatpos(pbag1,pindex->getindex(i+1,height));
	}
}

void readfromfiletoarray(const char* szfilename)
{
	ifstream infile(szfilename);
	if(!infile)
		return;

	int number,nHeight,nWidth;

	for(int k = 0;k<10;k++)
		for(int l = 0;l<12;l++)
			globalinputt[k][l] = 0;
	while(infile>>nHeight)
	{
		infile>>nWidth;
		infile>>number;
		globalinputt[nHeight-1][nWidth-1] += number;
	}
}

void initwakufromarraytobags(wakubags& wakubag,int w,int h,int step,int start)
{
	for(int i = 0;i<h;i++)
	{
		for(int j = start;j<w;j+=step)
		{
			if(globalinputt[i][j]>0)
			{
				basewaku* pWaku = new basewaku(i+1,(j+1)/step,step);
				AddwakuTobags(pWaku,wakubag,globalinputt[i][j]);
			}
		}
	}
}

void convertwaku4towaku3(wakubags& waku4,wakubags& waku3)
{
	wakuinterface* presult = NULL;
	bagsvistornormal vistor;
	while(waku4.HasContentToProcess(vistor))
	{
		presult = vistor.getwaku();
		int nheight = presult->getheight();
		layout processor(nheight,3,nheight,0);
		vistor.pageinfo(3,nheight);
		processor.LayoutWakus(waku4,false,vistor);
		vector< layoutrect* > pages;
		processor.getlayoutrect(pages);
		vector< layoutrect* >::iterator iter = pages.begin();
		vector< layoutrect* >::iterator iterend = pages.end();
		for(;iter!=iterend;++iter)
		{
			wakuinterface* presult = (*iter)->getwaku()->duplicate();
			presult->setwidth(4);
			presult->setwidthscale(3);
			AddwakuTobags(presult,waku3,1,true);
		}
	}
}

void combinewakustobigone(wakubags& from,int height1,int height2,int width,int widthbarrier)
{
	wakubags wakutmp(from.getwidth(),from.getheight(),from.getwscale());
	from.getsubbags(wakutmp,height1);
	if(height1!=height2&&height2!=0)
		from.getsubbags(wakutmp,height2);

	bagsvistornormal vistor;
	layout processor(height1+height2,width,height1,widthbarrier);
	vistor.pageinfo(width,height1+height2);

	processor.LayoutWakus(wakutmp,true,vistor);
	vector< layoutrect* > pages;
	processor.getlayoutrect(pages);
	vector< layoutrect* >::iterator iter = pages.begin();
	vector< layoutrect* >::iterator iterend = pages.end();
	from.addsubbags(wakutmp,height1);
	if(height1!=height2&&height2!=0)
		from.addsubbags(wakutmp,height2);
	for(;iter!=iterend;++iter)
	{
		AddwakuTobags((*iter)->getwaku()->duplicate(),from,1);
	}
}



void processcombinelayout(layout& processor)
{
	policystatus.rightpreference = false;
	wakubags waku4(3,16,4);
	wakubags waku3(4,16,3);
	initwakufromarraytobags(waku4,11,10,4,3);
	initwakufromarraytobags(waku3,12,10,3,2);
	convertwaku4towaku3(waku4,waku3);
	int i = 0;
	for(i = 3;i>0;i--)
	{
		combinewakustobigone(waku3,7,3,i,i);
		//waku3.debgout();
	}
	for(i = 3;i>0;i--)
	{
		combinewakustobigone(waku3,5,5,i,i);
		//waku3.debgout();
	}
	for(i = 3;i>0;i--)
	{
		combinewakustobigone(waku3,5,3,i,i);
		//waku3.debgout();
	}
	for(i = 3;i>0;i--)
	{
		combinewakustobigone(waku3,7,1,i,i);
		//waku3.debgout();
	}
	for(i = 3;i>0;i--)
	{
		combinewakustobigone(waku3,3,3,i,i);
		//waku3.debgout();
	}
	/*
	for(i = 10;i>0;i--)
	{
		combinewakustobigone(waku3,i,0,4,0);
	}*/
	bagsvistornormal vistor;
	vistor.pageinfo(4,16);
	vistor.setpreferencewidth(4);
	vistor.setpreferenceheight(3);

	processor.LayoutWakus(waku3,false,vistor);
}

void processnormallayout(layout& processor)
{
	policystatus.rightpreference = false;
	wakubags waku4(3,16,4);
	wakubags waku3(4,16,3);
	initwakufromarraytobags(waku4,11,10,4,3);
	initwakufromarraytobags(waku3,12,10,3,2);
	convertwaku4towaku3(waku4,waku3);
	bagsvistornormal vistor;
	vistor.pageinfo(4,16);
	vistor.setpreferencewidth(4);
	vistor.setpreferenceheight(0);

	processor.LayoutWakus(waku3,false,vistor);
}

void combine3_1wakusfinal(wakubags& from,wakubags& pagecomp)
{
	//for(int i = from.getheight()-2;i>0;i--)
	policystatus.rightpreference = false;
	policystatus.ignorevalidate = true;
		for(int i = from.getheight();i>1;i-=2)
	
	{
		wakubags wakutmp(from.getwidth(),from.getheight(),from.getwscale());
		vector < pair<int,int> > vecitem;
		for(int j = i;j>0;j--)
		{
			vecitem.push_back(pair<int,int>(1,j));
			vecitem.push_back(pair<int,int>(3,j));
			vecitem.push_back(pair<int,int>(4,j));
		}
		from.exchangebags(wakutmp,vecitem);
		pattern3_1vistor vistor;
		vistor.pageinfo(4,i);
		vistor.setpreferencewidth(3);

		layout processor(i,4,0,3);
		processor.LayoutWakus(wakutmp,true,vistor);
		vector< layoutrect* > pages;
		processor.getlayoutrect(pages);
		vector< layoutrect* >::iterator iter = pages.begin();
		vector< layoutrect* >::iterator iterend = pages.end();
		from.exchangebags(wakutmp,vecitem);
		for(;iter!=iterend;++iter)
		{
			AddwakuTobags((*iter)->getwaku()->duplicate(),pagecomp,1);
		}
	}
	policystatus.ignorevalidate = false;
}

void combine2_2wakusfinal(wakubags& from,wakubags& pagecomp)
{
	policystatus.ignorevalidate = true;
	for(int i = from.getheight();i>2;i-=2)
		//for(int i = 5;i<from.getheight();i++)
	
	{
		wakubags wakutmp(from.getwidth(),from.getheight(),from.getwscale());
		vector < pair<int,int> > vecitem;
		for(int j = i;j>0;j--)
		{
			vecitem.push_back(pair<int,int>(2,j));
			vecitem.push_back(pair<int,int>(4,j));
		}
		from.exchangebags(wakutmp,vecitem);
		pattern2_2vistor vistor;
		vistor.pageinfo(4,i);
		vistor.setpreferencewidth(0);

		layout processor(i,4,0,0);
		processor.LayoutWakus(wakutmp,true,vistor);
		vector< layoutrect* > pages;
		processor.getlayoutrect(pages);
		vector< layoutrect* >::iterator iter = pages.begin();
		vector< layoutrect* >::iterator iterend = pages.end();
		from.exchangebags(wakutmp,vecitem);
		for(;iter!=iterend;++iter)
		{
			AddwakuTobags((*iter)->getwaku()->duplicate(),pagecomp,1);
		}
	}
	policystatus.ignorevalidate = false;
}

void processsymetrylayout(layout& processor)
{
	policystatus.rightpreference = false;
	wakubags waku4(3,16,4);
	wakubags waku3(4,16,3);
	initwakufromarraytobags(waku4,11,10,4,3);
	initwakufromarraytobags(waku3,12,10,3,2);
	{
	wakubags pagecomp(4,16,3);
	combine3_1wakusfinal(waku3,pagecomp);
	combine2_2wakusfinal(waku3,pagecomp);
	convertwaku4towaku3(waku4,waku3);
	waku3.addwakubags(pagecomp);
	}
	bagsvistornormal vistor;
	vistor.pageinfo(4,16);
	vistor.setpreferencewidth(4);
	vistor.setpreferenceheight(3);
	policystatus.ignorevalidate = true;
	processor.LayoutWakus(waku3,false,vistor);
}

void outputwakuinfo()
{
	int nTotalnum = 0;
	int nTotalarea = 0;
	int bestneedpages = 0;
	nbakoffullcolumnwaku = 0;
	for(int i = 0;i<10;i++)
	{
		for(int j = 0;j<12;j++)
		{
			nTotalnum+=globalinputt[i][j];
			nTotalarea+=((i+1)*(j+1)*globalinputt[i][j]);
			if(j==11)
				nbakoffullcolumnwaku+=globalinputt[i][j];
		}

	}
	bestresult = 1;
	int nrealarea = nTotalarea;
	nTotalarea-=12*(16-nglobaltitlenum);
	bestneedpages = 0;
	if(nTotalarea>=0)
	{
		bestneedpages = nTotalarea/(12*16);
		if(nTotalarea%(12*16))
			bestneedpages++;
		bestresult+=bestneedpages;
	}
	bestneedpages = bestresult;
	
	cout<<endl;
	cout<<"best result: "<<bestneedpages<<endl;
	cout<<"total area : "<<nrealarea<<endl;
	cout<<"total waku num: "<<nTotalnum<<endl;
}

bool outputnumberseqiter(int num1,int num2,vector<int> prefixnum)
{
	if(num1<=0)
	{
		return true;
	}
	if(num2==1)
	{
		if(prefixnum[num2-1]<num1)
			return false;
		else
			return true;
	}
	bool result = false;
	if(num1>=num2)
	{
		if(!(prefixnum[num2-1]<1))
		{
			prefixnum[num2-1]-=1;
			num1-=num2;
			result = outputnumberseqiter(num1,num2,prefixnum);
			prefixnum[num2-1]+=1;
			num1+=num2;
		}
		if(result)
			return true;
		else
			return outputnumberseqiter(num1,num2-1,prefixnum);
	}

	return outputnumberseqiter(num1,num2-1,prefixnum);
}
vector< compositewaku* > pattern14;
vector< compositewaku* > pattern15;
vector< compositewaku* > patternhalf;

void clearpattern()
{
	vector< compositewaku* >::iterator iter = pattern14.begin();
	for(;iter!=pattern14.end();++iter)
		delete *iter;
	iter = pattern15.begin();
	for(;iter!=pattern15.end();++iter)
		delete *iter;
	iter = patternhalf.begin();
	for(;iter!=patternhalf.end();++iter)
		delete *iter;
}

void initpattern()
{
	char patternstr[128];
	int localinputt[10][12];
	int ncolumn;
	{
		ifstream infile("titlepattern15.txt");
		if(!infile)
			return;

		int number,nHeight;
		int xpos,ypos,xwidth,yheight;
		while(infile>>patternstr)
		{
			infile>>nHeight;
			infile>>ncolumn;
			infile>>number;
			vector<int> vecxpos;
			vector<int> vecypos;
			vector<int> vecxwidth;
			vector<int> vecyheight;
			{
			for(int l = 0;l<10;l++)
				for(int m = 0;m<12;m++)
					localinputt[l][m] = 0;
			}
			for(int i = 0;i<number;i++)
			{
				infile>>xpos;
				vecxpos.push_back(xpos);
				infile>>ypos;
				vecypos.push_back(ypos);
				infile>>xwidth;
				vecxwidth.push_back(xwidth);
				infile>>yheight;
				vecyheight.push_back(yheight);
				localinputt[yheight-1][xwidth-1]+=1;
			}
			infile>>patternstr;
			{
				compositewaku* pcom = new compositewaku();
				pcom->setwidth(4);
				pcom->setwidthscale(3);
				pcom->setheight(nHeight);
				for(int i = 0;i<number;i++)
				{
					basewaku* pwaku = new basewaku(vecyheight[i],vecxwidth[i]/3,3);
					pwaku->setpos(vecxpos[i]/3,vecypos[i]);
					pcom->AddWaku(pwaku);
				}
				pattern15.push_back(pcom);
			}
		}
	}
	
	{
		ifstream infile("titlepattern14.txt");
		if(!infile)
			return ;

		int number,nHeight;
		int xpos,ypos,xwidth,yheight;
		while(infile>>patternstr)
		{
			infile>>nHeight;
			infile>>ncolumn;
			infile>>number;
			vector<int> vecxpos;
			vector<int> vecypos;
			vector<int> vecxwidth;
			vector<int> vecyheight;
			{
			for(int l = 0;l<10;l++)
				for(int m = 0;m<12;m++)
					localinputt[l][m] = 0;
			}
			for(int i = 0;i<number;i++)
			{
				infile>>xpos;
				vecxpos.push_back(xpos);
				infile>>ypos;
				vecypos.push_back(ypos);
				infile>>xwidth;
				vecxwidth.push_back(xwidth);
				infile>>yheight;
				vecyheight.push_back(yheight);
				localinputt[yheight-1][xwidth-1]+=1;
			}
			infile>>patternstr;
			{
				compositewaku* pcom = new compositewaku();
				pcom->setwidth(4);
				pcom->setwidthscale(3);
				pcom->setheight(nHeight);
				for(int i = 0;i<number;i++)
				{
					basewaku* pwaku = new basewaku(vecyheight[i],vecxwidth[i]/3,3);
					pwaku->setpos(vecxpos[i]/3,vecypos[i]);
					pcom->AddWaku(pwaku);
				}
				pattern14.push_back(pcom);
			}
		}
	}

	{
		ifstream infile("halfpattern.txt");
		if(!infile)
			return ;

		int number,nHeight;
		int xpos,ypos,xwidth,yheight;
		while(infile>>patternstr)
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -