📄 waku.cpp
字号:
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 + -