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

📄 waku.cpp

📁 用于自动商业集版的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			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);
				}
				patternhalf.push_back(pcom);
			}
		}
	}

}

int ntitle15 = 0;
int ntitle14 = 0;

layoutrect* processtitlepage()
{
	nfullcolumnintitlepage = 0;
	layoutrect* prect = NULL;
	if(nglobaltitlenum==1)
	{
		for(;ntitle15<pattern15.size();ntitle15++)
		{
			compositewaku* pcom = pattern15[ntitle15];
			vector< wakuinterface* > tmpwaku;
			pcom->getwakus(tmpwaku);
			int localinputt[10][12];
			{
				for(int k = 0;k<10;k++)
					for(int l = 0;l<12;l++)
						localinputt[k][l] = 0;
			}
			vector< wakuinterface* >::iterator iter = tmpwaku.begin();
			//cout<<"patternbegin"<<endl;
			for(;iter!=tmpwaku.end();++iter)
			{
				localinputt[(*iter)->getheight()-1][(*iter)->getwidth()*(*iter)->getwidthscale()-1]+=1;
				//cout<<(*iter)->getwidth()*(*iter)->getwidthscale()<<" "<<(*iter)->getheight()<<endl;
			}
			//cout<<"patternend"<<endl;
			bool bematch = true;
			{
				for(int k = 0;k<10;k++)
				{
					for(int l = 0;l<12;l++)
					{
						if(globalinputt[k][l]<localinputt[k][l])
						{
							bematch = false;
							break;
						}
					}
					if(!bematch)
						break;
				}
			}
			if(bematch)
			{
				prect = new layoutrect(4,15,3);
				compositewaku* pcom1 = prect->getwaku();
				iter = tmpwaku.begin();
				for(;iter!=tmpwaku.end();++iter)
					pcom1->AddWaku((*iter)->duplicate());
				{
					for(int k = 0;k<10;k++)
					{
						for(int l = 0;l<12;l++)
						{
							globalinputt[k][l]-=localinputt[k][l];
							if(l==11)
								nfullcolumnintitlepage+=localinputt[k][l];
						}
					}
				}
				break;
			}
		}
	}
	else if(nglobaltitlenum==2)
	{
		for(;ntitle14<pattern14.size();ntitle14++)
		{
			compositewaku* pcom = pattern14[ntitle14];
			vector< wakuinterface* > tmpwaku;
			pcom->getwakus(tmpwaku);
			int localinputt[10][12];
			{
				for(int k = 0;k<10;k++)
					for(int l = 0;l<12;l++)
						localinputt[k][l] = 0;
			}
			vector< wakuinterface* >::iterator iter = tmpwaku.begin();
			for(;iter!=tmpwaku.end();++iter)
				localinputt[(*iter)->getheight()-1][(*iter)->getwidth()*(*iter)->getwidthscale()-1]+=1;
			bool bematch = true;
			{
				for(int k = 0;k<10;k++)
				{
					for(int l = 0;l<12;l++)
					{
						if(globalinputt[k][l]<localinputt[k][l])
						{
							bematch = false;
							break;
						}
					}
					if(!bematch)
						break;
				}
			}
			if(bematch)
			{
				prect = new layoutrect(4,14,3);
				compositewaku* pcom1 = prect->getwaku();
				iter = tmpwaku.begin();
				for(;iter!=tmpwaku.end();++iter)
					pcom1->AddWaku((*iter)->duplicate());
				{
					for(int k = 0;k<10;k++)
					{
						for(int l = 0;l<12;l++)
						{
							globalinputt[k][l]-=localinputt[k][l];
							if(l==11)
								nfullcolumnintitlepage+=localinputt[k][l];
						}
					}
				}
				break;
			}
		}
	}
	return prect;
}

void setstartpattern()
{
	ntitle15 = 0;
	ntitle14 = 0;
}

bool haspatterntoprocess()
{
	if(nglobaltitlenum==0)
		return false;
	if(nglobaltitlenum==1)
		return ntitle15<pattern15.size();
	if(nglobaltitlenum==2)
		return ntitle14<pattern14.size();
	return false;

}

void nextpattern()
{
	ntitle15++;
	ntitle14++;
}

void processtitlelayout(layout** processor)
{
	int localinputt[10][12];
	{
		for(int k = 0;k<10;k++)
			for(int l = 0;l<12;l++)
				localinputt[k][l] = globalinputt[k][l];
	}
	nfullcolumnintitlepage = 0;
	layoutrect* prect = processtitlepage();
	if(prect!=NULL)
		bestresult-=1;


	layout* processor1 = new layout(16,4,0,0);
	layout* processor2 = new layout(16,4,0,0);
	layout* processor3 = new layout(16,4,0,0);

	int nfullcolumnwaku = nbakoffullcolumnwaku-nfullcolumnintitlepage;
	if(bestresult>0)
	{
		nfullcolumnwakuaverage = nfullcolumnwaku/bestresult;
		if(nfullcolumnwaku%(bestresult))
		{
			nfullcolumnwakuaverage++;
		}
	}
	nfullcolumnleft = nfullcolumnwaku;
	processnormallayout(*processor1);
	nfullcolumnleft = nfullcolumnwaku;
	processsymetrylayout(*processor2);
	nfullcolumnleft = nfullcolumnwaku;
	processcombinelayout(*processor3);

	vector< layoutrect* > result1;
	processor1->getlayoutrect(result1);

	vector< layoutrect* > result2;
	processor2->getlayoutrect(result2);

	vector< layoutrect* > result3;
	processor3->getlayoutrect(result3);

	if(prect!=NULL)
		bestresult+=1;

	if(result2.size()<=result1.size()&&result2.size()<=result3.size())
	{
		if(prect!=NULL)
			processor2->addonepage(prect);
		*processor = processor2;
		delete processor1;
		delete processor3;
	}
	else if(result1.size()<=result2.size()&&result1.size()<=result3.size())
	{
		if(prect!=NULL)
			processor1->addonepage(prect);
		*processor = processor1;
		delete processor2;
		delete processor3;
	}else{
		if(prect!=NULL)
			processor3->addonepage(prect);
		*processor = processor3;
		delete processor1;
		delete processor2;
	}


	{
		for(int k = 0;k<10;k++)
			for(int l = 0;l<12;l++)
				globalinputt[k][l] = localinputt[k][l];
	}

}

void processrectlayout(const char* szfilename,int ntitle)
{
	int i = 0;
	nglobaltitlenum = ntitle;

	readfromfiletoarray(szfilename);
	outputwakuinfo();
	layout* pminlayout = NULL;
	bool needtoprocess = true;
	
	setstartpattern();
	while(needtoprocess)
	{
		layout* processor = NULL;
		processtitlelayout(&processor);
		nextpattern();
		needtoprocess = haspatterntoprocess();
		vector< layoutrect* > result;
		if(pminlayout==NULL)
		{
			pminlayout = processor;
		}
		else 
		{
			vector< layoutrect* > result1;
			vector< layoutrect* > result2;
			processor->getlayoutrect(result1);
			pminlayout->getlayoutrect(result2);
			if(result1.size()<result2.size())
			{
				delete pminlayout;
				pminlayout = processor;
			}else{
				delete processor;
			}
		}
		
		pminlayout->getlayoutrect(result);
		cout<<result.size()<<endl;
		if(result.size()==bestresult)
			needtoprocess = false;
	}
	ofstream fileout("test.ps");
	pminlayout->OutputResult(fileout,true);
	ofstream fileout1("result.txt");
	pminlayout->OutputResult(fileout1,false);
	delete pminlayout;
}


void wakuslot::debgout()
{
	cout<<"ntotal curtotal height width "<<nTotal<<" "<<nCurTotal<<" "<<nHeight<<" "<<nWidth<<" "<<endl;
}

void wakubag::debgout()
{
	cout<<"bag ntotal curtotal height width "<<nTotal<<" "<<nCurTotal<<" "<<nHeight<<" "<<nWidth<<" "<<endl;
	vector< wakuslot* >::iterator iter = wakus.begin();
	vector< wakuslot* >::iterator iterend = wakus.end();
	for(;iter!=iterend;++iter)
		(*iter)->debgout();
}

void wakubags::debgout()
{
	cout<<"total area : "<<gettotalscaledarea()<<endl;
	cout<<"total waku num: "<<getbasicnum()<<endl;
	cout<<endl;
}

void bagsvistornormal::layoutstatusoflastwaku(bool besuc)
{
	bsuclasttime = besuc;
	if(!besuc) lastvist++;
	if(besuc&&presult!=NULL)
	{
		if(presult->getmaxwidth()==12)
		{
			curfull++;
			if(curfull==maxfull)
				lastvist = 0;//reset.
			nfullcolumnleft--;
			if(nfullcolumnleft==0)
				maxfull = curfull;
		}
	}
}

bool bagsvistornormal::canvistoncemore(int index)
{
	if(bemaxwidth)
	{
		if(lastpos<index){
			bemaxwidth = false;
			lastvist = 0;
		}else{
			lastvist = index+1;
		}
		return true;
	}else
		return false;
}

void bagsvistornormal::beginonepage(int ncurpageheight)
{
	bsuclasttime = true;
	lastvist = 0;
	bemaxwidth = true;
	presult = NULL;
	curpageheight = ncurpageheight;
	curfull = 0;
	maxfull = min(nfullcolumnleft,nfullcolumnwakuaverage);
}

bool bagsvistornormal::canprocessfullcolumn()
{
	bool result = ((curfull<maxfull));
	return result;
}
bool bagsvistornormal::cansetwaku(wakuinterface* pwaku)
{
	if(pwaku==NULL)
		return false;
	if((curpageheight!=16)&&pwaku->getmaxwidth()==12)
	{
		lastvist++;
		return false;
	}
	if((nfullcolumnleft>0)&&(curpageheight==16)&&canprocessfullcolumn()&&(pwaku->getmaxwidth()!=12))
	{
		lastvist++;
		return false;
	}
	if(bemaxwidth)
	{
		//if(pwaku->getwidth()<npreferencewidth)
		//{
			//lastvist++;
		//	return false;
		//}
		if(pwaku->getheight()<npreferenceheight)
		{
			lastvist++;
			return false;
		}

	}
	presult = pwaku;
	return true;
}

bool pattern3_1vistor::cansetwaku(wakuinterface* pwaku)
{
	bool beresult = true;
	presult = pwaku;
	if((curpageheight!=16)&&pwaku->getmaxwidth()==12)
	{
		lastvist++;
		return false;
	}
	if((curpageheight==16)&&canprocessfullcolumn()&&(pwaku->getmaxwidth()!=12))
	{
		lastvist++;
		return false;
	}
	if(pwaku->getmaxwidth()==12&&canprocessfullcolumn())
	{
		return true;
	}
	if(pwaku->getwidth()==1)
	{
		if(ncurpagedifference1==0||ncurpagedifference1<pwaku->getheight())
		{
			lastvist++;
			return false;
		}
		wakuvector1[pwaku->getheight()-1]-=1;
		beresult = outputnumberseqiter(ncurpagedifference1-pwaku->getheight(),pwaku->getheight(),wakuvector1);
		wakuvector1[pwaku->getheight()-1]+=1;
		if(!beresult)
			lastvist++;
	
	}else 	if(pwaku->getwidth()==3)
	{
		if(ncurpagedifference3==0||ncurpagedifference3<pwaku->getheight())
		{
			lastvist++;
			return false;
		}
		wakuvector3[pwaku->getheight()-1]-=1;
		beresult = outputnumberseqiter(ncurpagedifference3-pwaku->getheight(),pwaku->getheight(),wakuvector3);
		wakuvector3[pwaku->getheight()-1]+=1;
		if(!beresult)
			lastvist++;
	
	}

	return beresult;
}

void pattern3_1vistor::baginfo(wakubag** pbags,index* pindex)
{
	if(beinitbag)
		return;
	ncurpagedifference3 = curpageheight;
	ncurpagedifference1 = curpageheight;
	ntimes = 0;
	int count3 = 1;
	int count1 = 1;
	for(int i = 1;i<=npageheight;i++)
	{
		wakuvector1.push_back(pbags[pindex->getindex(1,i)]->GetTotal());
		if(pbags[pindex->getindex(1,i)]->GetTotal()>0)
		{
			ntimes = max(ntimes,pindex->getindex(1,i));
			count1 = i;
		}
		wakuvector3.push_back(pbags[pindex->getindex(3,i)]->GetTotal());
		if(pbags[pindex->getindex(3,i)]->GetTotal()>0)
		{
			ntimes = max(ntimes,pindex->getindex(3,i));
			count3 = i;
		}
	}
	wakuvector1.resize(count1);
	wakuvector3.resize(count3);
	beinitbag = true;
}

void bagsvistornormal::baginfo(wakubag** pbags,index* pindex)
{
	if(beinit)
		return;
	beinit = true;
	lastpos = 0;
	for(int i = 1;i<=npageheight;i++)
	{
		if(pbags[pindex->getindex(npreferencewidth,i)]->GetTotal()>0)
			lastpos = max(lastpos,pindex->getindex(npreferencewidth,i));
	}
}

bool pattern3_1vistor::canvistoncemore(int ncurindex)
{
	if(ncurindex<ntimes)
		return true;
	else
		return false;
}

void pattern3_1vistor::beginonepage(int ncurpageheight)
{
	bsuclasttime = true;
	lastvist = 0;
	bemaxwidth = true;
	presult = NULL;
	beinitbag  = false;
	ntimes = 0;
	curpageheight = ncurpageheight;
	curfull = 0;
	maxfull = min(nfullcolumnleft,nfullcolumnwakuaverage);
}

void pattern3_1vistor::layoutstatusoflastwaku(bool besc)
{
	if(besc&&presult!=NULL)
	{
		if(presult->getwidth()==1)
		{
			ncurpagedifference1-=presult->getheight();
			wakuvector1[presult->getheight()-1]-=1;
		}
		else if(presult->getwidth()==3)
		{
			ncurpagedifference3-=presult->getheight();
			wakuvector3[presult->getheight()-1]-=1;
		}
		if(presult->getmaxwidth()==12)
		{
			curfull++;
			if(curfull==maxfull)
				lastvist = 0;//reset.
			nfullcolumnleft--;
			if(nfullcolumnleft==0)
				maxfull = curfull;
			ncurpagedifference1-=presult->getheight();
			ncurpagedifference3-=presult->getheight();
		}
	}
	bsuclasttime = besc;
}

⌨️ 快捷键说明

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