①车厢可以从入轨的前部(即右端)移动到一个缓冲铁轨的顶部或出轨的左端。
②车厢可以从一个缓冲铁轨的顶部移动到出轨的左端。
考察图2-18。3号车厢在入轨的前部,但由于它必须位于1号和2号车厢的后面,因此不能立即输出3号车厢,可把3号车厢送入缓冲铁轨H1。下一节车厢是6号车厢,也必须送入缓冲铁轨。如果把6号铁轨送入H1,那么重排过程将无法完成,因为3号车厢位于6号车厢的后面,而按照重排的要求,3号车厢必须在6号车厢之前输出。因此可把6号车厢送入H2。下一节车厢是9号车厢,被送入H3,因为如果把它送入H1或H2,重排过程也将无法完成。请注意:当缓冲铁轨上的车厢编号不是按照从顶到底的递增次序排列时,重排任务将无法完成。至此,缓冲铁轨的当前状态如图2-19a所示。
图2-19 缓冲铁轨中间状态
接下来处理2号车厢,它可以被送入任一个缓冲铁轨,因为它能满足缓冲铁轨上车厢编号必须递增排列的要求,不过,应优先把2号车厢送入H1,因为如果把它送入H3,将没有空间来移动7号车厢和8号车厢。如果把2号车厢送入H2,那么接下来的4号车厢必须被送入H3,这样将无法移动后面的5号、7号和8号车厢。新的车厢u应送入这样的缓冲铁轨:其顶部的车厢编号v满足vu,且v是所有满足这种条件的缓冲铁轨顶部车厢编号中最小的一个编号。只有这样才能使后续的车厢重排所受到的限制最小。我们将使用这条分配规则(assignment
rule)来选择缓冲铁轨。
接下来处理4号车厢时,三个缓冲铁轨顶部的车厢分别是2号、6号和9号车厢。根据分配规则,4号车厢应送入H2。这之后,7号车厢被送入H3。图2-19b给出了当前的状态。接下来,1号车厢被送至出轨,这时,可以把H1中的2号车厢送至出轨。之后,从H1输出3号车厢,从H2输出4号车厢。至此,没有可以立即输出的车厢了。
接下来的8号车厢被送入H1,然后5号车厢从入轨处直接输出到出轨处。这之后,从H2输出6号车厢,从H3输出7号车厢,从H1输出8号车厢,最后从H3输出9号车厢。
对于图2-19a的初始排列次序,在进行车厢重排时,只需三个缓冲铁轨就够了,而对于其他的初始次序,可能需要更多的缓冲铁轨。例如,若初始排列次序为1,n,n-1,…,2,则需要n-1个缓冲铁轨。
为了实现上述思想,用k个链表形式的堆栈来描述k个缓冲铁轨。之所以采用链表形式的堆栈而不是公式化形式的堆栈,原因在于前者仅需要n-1个元素。函数Railroad用于确定重排n个车厢,它最多可使用k个缓冲铁轨并假定车厢的初始次序为p[1:n]。如果不能成功地重排,Railroad返回false,否则返回true。如果由于内存不足而使函数失败,则引发一个异常NoMem。
函数Railroad在开始时创建一个指向堆栈的数组H,H[i]代表缓冲铁轨i,1≤i≤k。NowOut是下一个欲输出至出轨的车厢号。minH是各缓冲铁轨中最小的车厢号,minS是minH号车厢所在的缓冲铁轨。
在for循环的第i次循环中,首先从入轨处取车厢p[i],若p[i]=NowOut,则将其直接送至出轨,并将NowOut的值增1,这时,有可能会从缓冲铁轨中输出若干节车厢(通过while循环把它们送至出轨处)。如果p[i]不能直接输出,则没有车厢可以被输出,按照前述的铁轨分配规则把p[i]送入相应的缓冲铁轨之中。
解答
Railroad(int p[],int n,int k)
{
∥k个缓冲铁轨,车厢初始排序为p[1:n]
∥如果重排成功,返回1,否则返回0
∥创建与缓冲铁轨对应的堆栈
LinkedStack<int>H;
H=new LinkedStack<int>[k+1];
int NowOut=1; ∥下一次要输出的车厢
int minH=n+l; ∥缓冲铁轨中编号最小的车厢
int minS; ∥minH号车厢对应的缓冲铁轨
∥车厢重排
for(int i=1;i<=n;i++)
if(p[i]==NowOut){∥直接输出t
printf("Move car %d from input to output\\n",p[i]);
NowOut++;
∥从缓冲铁轨中输出
while(minH==NowOut){
Output(minH,minS,H,k,n);
NowOut++;
}
}
else{ ∥将p[i]送入某个缓冲铁轨
if(!Hold(p[i],minH,minS,H,k,n))
return 0;
}
return 1;
}
下面分别给出了Railroad中所使用的函数Output和Hold。Output用于把一节车厢从缓冲铁轨送至出轨处,它同时将修改minS和minH。函数Hold根据车厢分配规则把车厢c送入某个缓冲铁轨,必要时,它也需要修改minS和minH。
void Output(int& minH,int& minS,LinkedStack<int>H[],int k,int n)
{
∥把车厢从缓冲铁轨送至出轨处,同时修改minS和minH
int c;∥车厢索引
∥从堆栈minS中删除编号最小的车厢minH
H[minS]Delete(c);
printf("Move car %d from holding track %d to output\\n",minH,minS);
∥通过检查所有的栈顶,搜索新的minH和minS
minH=n+2;
for(int i=1;i<=k;i++)
if(!H[i]IsEmpty()&&(c=H[i]Top())<minH){
minH=c;
minS=i;
}
} >第一,你需要换一个汉化版本完全的MMD,你的汉化版本不完全所以你不能使用pmd格式的文件,请使用天知道版。
第二,贴图可以用PMX Editor补全,先在你的PMX Editors 中打开那个模型,然后在材质那一栏中调整,哪怕都是乱码也可以原样黏回去的。
你等下把QQ私信我,我加你,远程演示一下,要么你也可以把模型发过来我帮你补贴图。不过我还是觉得你跟着学一下比较好,天知道版MMD如果没有的话你可以留个#邮#箱#,要是你不想我加你的话,我给你发过来好了。 *** 作方法:将手机的系统语言设置为繁体中文,再次进入软件会发现软件已经变成繁体中文。
n站使用技巧:1、n站的特点是可以使用留言d幕,方便用户及时发布自己观看视频的感受。
2、点击软件页面右上角的三道横线图标,可以打开软件的功能界面,比如可以查看动画排行榜、浏览记录、我的页面、动画页面。
NICONICO动画要求观众根据注册顺序注册和使用APP。用户可以开通会员,享受付费服务。该网站成立于2006年,公司类别为线上d幕视频分享网站,公司总部在日本,2007年,该网站注册人数超过10万。2013年,网站的投稿数量超过2000万。
资料拓展:中国大陆于2010年12月9日傍晚禁止解析niconico网站,将其屏蔽。2013年2月7日,大陆取消对“niconico动画”站点的屏蔽,连接速度较慢,但不影响使用。2013年2月8日中午,连接速度正常,没有无法载入页面的情况,进入主页后自动跳至英文版。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)