迷宫程序设计
一.求分需
(1)析以维二组数MZEAM[+2[]+N]表2迷示,宫中其MAZE[:0]J][M和ZAEM[+1][J(0≤]JN≤+)及1MZA[IE[]]0MA和EZI][[+1]N0≤(I≤+1M)为加的一添圈碍。障组中以数素值为0表元通示,1路示障碍表。限迷宫定的小大,N≤M01。
(2)用 户文以件的式形入输迷宫数的据文:件第中行一数的为迷宫据行数的M列数和;N第从行至2M+1第(每行行N个数)为迷值宫,一行中的两个数同之间用空白字符相字。隔
3)迷宫的(口位置入和口出置位可用户随由时定。设
(4) 若设定的迷存宫通在路则以长方,形阵将迷宫及式通路其输出到标输出准文件即(
终)上端其中,字,符#”表“示障碍字符,*”“示表径路的上置位,符字“”表@“死示胡同”即曾经经,过但不能达出到口的置,其位用空余格符示。若表定的迷设不宫在通路存,报则相应信告。息
( )5本程只求出一条成序功的路。然通而,只要对迷需求宫解的数函作小量修,改便可求全部得路。径
6)(试数测见据题,原入口当位置为1(,)1,出位口为置9(,)8,输时出数据为应
: ** #@ @@ #
*# @ @ @
# * * @ @# #
# # #*# # @
** * # * ** @#
* * * # *#
## # # * ##
# # *#
## * *
7)程序执(行命令的为
1)创建迷宫:; 2求)迷宫;解 3 输出迷宫)解的。
二.要概设计1.
定设的栈象数抽据类定型义:为
AD sTatc{k
据数对象:D{ai=a|i∈chasreti,=,1,……,n2n,0≥}
数据关系:R1={1a|i-1a,i∈D,i2…=,n}…
基操本作:
niItStack&()S
操作结:构造果个一栈S空。
estDroStyca(kS)&
初条始件:栈S已在存。
作操结:果销毁S。
C栈elartSakc(S&)初
始条:件栈S存在。已
操结果:将S清为作栈。空
SacktLngteh(&)S初
条始件栈:S已在存。操
作结果:回返栈S的长。度
StackEmty(p&)S
初条件:始栈S已存在。
操结作:若果为空栈,则S返TR回U,否E则返回FALES
Ge。ToptS,&(e)
始条件初:S已栈存在
操。作果:结栈S不空,若以e返则回栈顶素。元
ush(&PSe,)
始初件:条S已存栈。在
操作结果在栈:的S顶插栈入新栈顶元素e的。
oPp&S(&e),
始条初:栈件S已在。
存作结操:删除果S栈顶的元素并以e返,回其。值
StckarTaveserS(vi,si(t) )初
始件条:栈S已在。存
操作果:结栈底到从顶依次栈S对中每个元素调用的函visi数t().
}ADT s ackt2
设定迷宫.的抽数据类型象为
:DTA mae{z
据数对象:={aiD,|ai,jj∈‘{ 、’‘’#‘、@、‘’*}’0≤,im≤+1,0j≤≤n1,+
m n≤10,}
数关据:R={RO系WCOL,}
ROW =j|a-i1j,ai,,∈j,Di=1,……,+1m,=j0,…,…n1}+
C OL={aiai,|j1-ai,,jD∈,i0=……,,m1+,=j1
,…,…+1}
n本基作操:In
tiMaze(&Ma,,or,cwlo)
初始条:二维件组数a[rwo+][2cl+o2]已在存其中自,第1行至第row+行1每、中自第行1列至c第ol1+列的素元已有值并,以值0表且示通,以值1路示障碍。表
操结作果构:迷宫成的符字数型组以空,字白符表示通,路以符‘字’表示#障,碍在并宫四周迷上加一圈障。
Maz碍Paeth&M()初
始条件迷:宫已被赋M。值
作操结果若迷:M中存宫一条通路在则按如,规定改变下宫M迷状的态:字以“符*表”路径上示的置位字符,@”表““死胡示同;”则否宫的状态迷变不。
PinrMtza(Me)初
条始:件迷宫已M在存。
操作果:以结符形式字出迷输宫。
}ATDm aze;
3.本程序包三个模块含1)
程序模主块
oivd amni( )
{ 初 始化
do{
接受令;命
理命令处;
}hwli(命令!e=“退出”;
}
))栈模2--块--实现栈抽数据类型
象)迷3宫模块---实现迷宫抽象数据-类型各
模之间块的用调关如下系:
程序主块模
迷宫模块
栈模块
4.解迷求中宫一条通路伪的码算法
设定:当前位的置初值为口位置入
;d{
若o当前位置可通,
则 {当前将置插入栈顶位; /纳入/径路
若该位是置出口置位则结束,; /求得路/存放在径栈中
否则切当换位前置东的邻方块新的当为位前置;
}则否{
若不空且栈位栈置尚有其方他未向探索被,
则设新的定当位置前沿顺时针方向为旋找转到的栈位置顶的一相下邻;
块若不空栈但顶栈位的四置周均不可,通则
{删栈顶位置去; /后退一/步从,径中路去该通删块,道
栈若空不则重新测试新的栈,位顶,置
直找到一个可通到相的邻或出块至栈空;栈
}
}}whi
e(l不栈空);
{空栈说明没有径存在路}三.详细
计设1.坐
标置位类型
type def trscu{
ti n t,r; c / /迷宫中行、的列围范
}Po sTpe;y
2迷宫类型
t.pedyf etructs{
int mn;,
hac arrrRANGE[][ANGER;] // 各置位取‘ ’值,#‘,‘@’’‘*’或
}MazTepe;y voi
d IitnMaze(MaezTpey ma&ze,int a[]][,nt riow,in tcl)
o//按 用户照输入的rwo行和co列l二维数的(元组素值0或1)为
/设/置迷宫的初,值括包上边缘加一的圈值
obl MaoePazthMaz(eTyep &mza,PosType seatrtP,soTpye edn)
// 解求迷宫azem,中从口sta入tr出到口nde一条的路径
//存在若则,回返RUT;否E返则F回LSE
A void riPnMtza(MezaTepy emaez
//)将迷以字符型宫方阵形式的出到输准输标文件出上
3.类栈型
typ eedfs ruct{t
ni t ste ;p //当前位在路径上的“序置”号
PsToyep sae; t / 当前的/标坐位
置
diectriveTpe diy; //往下一坐标位置方的向 }
ElmType; e //栈 的元类型素 type
ed strucf NtdeoTye{p
lEemTyep adta
;N oeTyde p * ext;n
} oNdeypT,*LineTkype; //结类型,点针指类
型typ eefd srutct{
L inTypek tp;o
in t si z;
e }St akc ; / 栈类/型
栈 的本操作设基置如:下
oid vIniSttcka(tacSk &)S
/ 初/化,始设S为栈(S.t空op=NLUL)
voi dD steoyrtSackstack (&S)
/销/栈毁,S并释放所占间空
void lCaerStckaS(tcka S)
& /将S清/空为栈
ni sttacLengkthS(actkS)
/返回栈S/的度S.长size
St atu StackEsmpt(Syatk cS
) / /S若为栈空(Stop==.ULLN),则返TR回EU;则否返F回LAES
St tua setToGpSta(k cs,EelmTpe ye)
/若/S不空栈,以e则带栈回元顶素并返TR回UE否,则回FA返LES; S
taut susP(hStcak &,ESelTmyp ee)
//分若配间空成,则功在S栈的顶入插新的栈顶元e,并素回返TUE,R
/否/栈则不变,并回F返ASE
L tatSus PopSt(akc &S,ElmeyTpe& )
e/ 若/不栈,则空除删的S顶栈元并以e素带其值,回且返回TRUE
// 则返回否FLAE
S v od StackTiavrrees(tSakcs,St atu(*vsiist)(leETmye e))p
/从/栈到栈底顶依次对S中每的个点调用函结数visti
其部中分作的操法:算
tSatu PusshS(takc& ,ElemTSpe ey)
{/若/分配间空成功则在S,栈的插顶入新栈顶的元e素并,回T返UER
; //否则 栈不,并变返回ALSF
E i f(akeModN(epe),{)
p >n-xets.t=op; .tsopp;=
.sszei+;+ r ternuTRUE;
}
el se etrru nFLAES;
}
tSaut sPp(Soatkc &SEl,emTpy &ee)
{/若栈不空/则删,S的栈除元顶素以并e回其带,且返值回TREU,
/否/返回F则ALSE且e无,意义
i(ftackESpty(m))Sr tuenr FLASE; else{
p=S. otp; S .topS=.otp-nex>t;
e p=>-dae;t S.s zi--; erturn eTUE;R
}
}
4求.宫迷径路的码算法伪
Sta:ts MazeuPath(MzeaTpye ame,zoPTsye pstrt,PosaTpyeend )
{ //若迷
宫存中在入从口stra到t口end的出道通,则求得条存一入栈在中
/(/从底栈栈顶为到从入到口口的出径)路,返并回TUE;否R则回F返ASLE
I nittScka(S;)c ruopsstart= ; /设/定“当前置位”为入口“置位”
curstp=e;1f uod=nFASLE ; // 探第一索步
do {
i f (aPs(samez,urcop))s{
/当/位前可置通过以即,是未曾走到的过道块留通足下迹
ooFPrint(mazetc,rups)o;
=(ceruteps,ucrosp1,);
Pus (She,;) / 加入/径路
fi(Sae(cmuros,enp)) doufn=dTRUE ; /到达终/(出口点
) lse{e
crpuo=seNtxPs(coupros1,;) /下一/位置是当位前置的邻
东 cu sret+p+ ; / 探索/下步一
} //else
}/if/
lese // 当位置前能不通过
fi!S(takEmptcy(S)){
Po(Spe),
; wh iele(.i==4d&!S&tcaEmptk(yS){)
M akrPrintma(e,z,seet)a;P p(oSe,;
) custerp-;- //留下不通过的标记能,退并一回步
}/ w/hli
if(e.di
e di+.+ ;Puhs(Se.) ; //下换一方个向索探
c upors=exNPos(ets.aete,.d); /i设/当前定置是位新方向上的该相邻块
}/ i/f
} /if/
whi}e(l!StcakEpmtyS()&&fo!un);d
retrnuf ond;u
/}M/zePatha
5.函主和数其函他数伪的算法
码 voi mdani( )
{/主/程 序
In tiiailztioan() ; /初/化始
do
{ R aeCdmmoandc(m)d//读;入一个作操命令符
In ertper(cmtd) ; //解执释行作操令命符
}hilew(mdc=‘q’&!&md!c=Q’‘;)
} /mai/n
oiv Idntialiiztaon()
i //系统{始化初
clrsrc()//;屏清
屏在幕上显方操示命作令清单:
rCeaMazt—ec MzaePth—a m rPntMizaep— Qui tq—;
在屏幕 方显下示作操令提示框:命
}/I/niitliaaztoni
oidvR edCommana(dcar h&mcd)
/{/读入作命操令符
显键示操入作令符命提示信的;息
d o{
c d=mgetce()h
}w ile(hcmd‘c’,‘C’,[‘m’,M’‘,p‘,‘’’,‘q’P‘Q,]’;
) /}/eaRCdomand
m ovdi nteIrprt(cearhcmd)
{ //解释行操作执命
switc令hcmd({)
cse ‘ac’,C’’:示用户提输入迷“宫据的文件名数ifenlam”e;
从 件读入文据数别分储存rnu在m,ncum二和数组维2中a
; I itnMza(ema,2ar,un,cnumm; // 创)建宫迷
输迷宫出建完毕的信立息
brae;kcase‘
’,‘M’m提:示用输入迷宫户的口fr入m和o出口t rme的坐标置位 ;if( aMezaPhtm(a,fom,term)r//)在路径存 提示用
察看户迷宫;
lese 出输该宫没有迷给定从入的到出口的口径路的息信; br
ae;k
cas ‘p’,‘Pe:’PritMnze(ma):a //将 标记路径息的迷宫输出到信终
}端/sw/ithc
}/In/ertrPet
.函6的调数关用图反映了演示系序的层次结程构:
主 序程
In italiizatin o RaedoCmamd n ItnerrePt
IntMaiez Ma ePzat h rintPaMze
IitnStcka usPh Pop St caEmkpt y S tckarTvares
e
Foo Ptint r aMkPrrnit Pass NextPos aSem
.调四试析分
.1次本业作较比简单只,有个一心算法核即,求迷宫的径路,所总以调试比较顺的,只利在调M试zePaaht法算,时遇两到个题:问一是其起,输初的出迷宫没中加有上@’‘的号记,发后是因为现在MarkrPint函数中迷宫的参数失“丢参变”的原;其二是因,于由回退没有时cur将ops之减随,一使栈中致径上路的号有序错
。 2栈的.素元的中tsep域有太没多处用可以,略省。
3.S tckTaarevse在调r试过程很中用,它可以插有入Maze在ath算P法多处,中察看以迷宫过程解走中路径的否正是确但,对后的执最版行没本用。有
4 .题本中个主要三法:I算intMza,eMzaeathP和rPitManz的e时间复杂均度0(为mn*)本题,空的间杂复度亦0(m为n*()栈占所大空间)
5最经.体验:会助D借BUG调试E和数据观器窗察,口以可加快到程找中序疵点。五
用户.册手
(1)本程的运行序境环DOS为作系操,执统行文件:为eTstazMee.xe
2)进(演入示程后序即,显文示方本式的户用面:界
(3)进入“ 产生迷宫C(eratMze)”的命令a后,提即示入迷键宫数的文件名,据束符为“回结车”符该,令命执行之后出“迷输宫建成”已。
4)进(入求迷“宫径路Ma(ePazht” )命令的后即提,示键入口位入置(号和行号,中间用列空格分开结,符为“回车符束)和”出口位(行置号列和,中号间用格分空,开结符为束“回符车),该”令命执行之输后出相应息信若。宫迷存在中路径,则执此行命令,后宫状迷已改变,态要重复若执行命此,令论是无改否出变和入口口的置,位均需重输新入迷宫数。据
(5) 入输“示迷宫显的”令命后,随输出即当的迷宫,即前迷宫初始的状态求或路径出后之状的。态
六
.测试果
结三测试组据数输出结果和别分如:下
.输1入文件名为:m.d1ta其,迷中数据为宫:
3 2
000
0
0 0 入口
置位:1 1
出口位:置3 2
求解路 后输出径迷的:宫
* *
**
2
.输文件名:m入2.adt,其迷宫中数据为
3 :4
0 00 0
0 0 1 1
0 00 0
口入位:1置 1 出口位
置: 34
求 解径路后出输的宫:迷* *
@@*
##
* * * 3
输.文件名:入m.dat3,其中宫数据迷题同中目测试的据数。
入口置位:1 1 出
位置口: 98
解求路径后出输的宫正确,并和迷需求分析所中相同。列
4 输.文入件:名m4.at,其d迷宫中据数:为4
9 0
0 0 0 0 0 1 0 0
0 10 0 0 10 0 0
0 0 1 11 0 0 1
1 00 1 1 1 0 1 0 0
口位入:置 1
1口位出:置 9
4出信息输:为此迷从入宫口
到出没有路口径。
.七附录
源序文件名清程单:
bse.Ha //用公的常和量型类s
tpas.H k //栈型类m
zeaH. /迷宫类型/t
esmtazeC. //主序程三
设.题计目
1.保龄球计
【分题问述描】
打 保龄球用是一滚球去撞击个01个站的立瓶,将瓶倒击一。局10轮分每,可轮球1滚次2或次以,击到的瓶数为依计分。一据局得分1为0轮得之和,分而每轮的得不分仅本轮的与球情况滚关,还可有与能后轮或一两轮后的球滚情况关,即有某:某轮滚次球击的倒数不瓶仅要计入轮得分本,可还会能计入一轮前两轮得分。或计分规则下:如 ①若某
轮一的第次一球滚就倒全击10部个,瓶则轮本不再滚球若是(十第轮还加2次需球滚,)该得轮为分次击本瓶倒数0与1后以2滚次所球倒瓶击数之;和
若②一某轮第的次滚球未击倒一部10个全瓶,则剩下对倒未瓶的再球滚一次如果这2次滚球击,全部倒10瓶个则,轮本不滚再球(是第十轮还若加1次滚球),需轮该得分这为2击次倒数1瓶0以后1与次球滚所倒瓶击之和;数
若③一轮2某次球未击滚倒全10个瓶,部本轮则不滚在,该轮球得分这为2滚次球击倒瓶所数之。
【基本要和】求
①拟1模打人保龄的过球,用一个二维数组程:nit [11x]4[]存储;每轮次击倒每的数和瓶得分及累计得分。以:i即行中的4个素x元i[][0]x、i][[]、x1[]i2][x、[i][]3别分记录i第轮第1次的滚球击的瓶数倒第2次、球滚击倒瓶数、的轮本分得和计累得;分
②输 每轮每入次滚球倒的击瓶数,第若1滚次球击的瓶数为10,倒该则轮只入输次1据;数
③出每轮每输次倒的击数和得瓶以分及累计得;例分如
一: 二三 四 五 六 七 八九 十
80 179 9 1 0108 9 10 8 2
0 21 1 00 110 2
201 9 99120 2 819 209 02 20
9 38 46 7781 511 4 31341 361 3 8
测试数【】据
如 上所。示
【注】鼓①励用采幕绘屏模拟图球过打;②程考:思模N拟人保龄球的打程。
过2.计统字
【问题描数述
】次某研科查调时得到了n个自数,每个然均数超不150过000000(1.0510*)。已知9不同的相不数超过10000个,在现需要统这些计然自各数自出现的数,次并照按自数从然小大的顺序输到出计统结。果
?【本基要求】
始数据原存保文件coun在.tn中,文i包件含+n1。第行1是行整数n表,示自然的数个;第数~n+2行1每一行自个然数。
结保存在文果c件unto.ou中t文,co件nt.uotu含包行m(mn为个自数然不中相同数的个数,)按自然照数小从到大的顺输序出每。输行出个两数整,分是别自然和该数出数的现次数其,间用一个空格开隔。
【试数据】测
c uotnin .
c uont.out8
2
42
4
5
1002
001 324
2
51
10 02
由于数量可能很大据,要意程注的序行运效率。【
实提现】示
1)?????己自立输入建件文cout.in。使nT用C或CVW或ord等辑器编编等样例辑输内入,容按文本格存盘。式程从该序件文中读数取处据,理后将最果写结入文件conuto.u中。t2)定义
结体构型,类说明构结体组,记数自录数然和数出该的次现数定义。下:如st
rcut
{lon
gitn umbnr;e
lon gnt coiunt
}; n um[10000]
3);文件中从每出一个读据,数在数就组中找查,若在存,该则出现次数增1数否则将该数,插入组数,出现次数为中1插入,使数后中组的数据按然数有序自。
3.停车管理场
【问题描】述
设停车场是一个停放n辆可汽的车长狭道通且,有只一大门可供汽车个出进。汽车在车场停内按车到达辆间时的后顺先,依次序由向北南排列大(在门最端,南最先达到的第辆车停放在一停车场的北端),若最停场内已停车n辆满车,则后来汽汽车只能在的外的便门上道等,候旦有车一走,开则排在便道上的第一车即辆可入;开停当车场内辆某要车离开时在,之它进后入车的辆必先须出退场为它让车,路待该辆车出开大门,外他其车辆再原次序按入进车,场辆每放在停场车车在的它开离车场时必停须按停留它时的间短交纳长用。试为费停车场编制按上要求述行管进理模的程拟序。【基本
要】求
以 模栈停拟车场以队,列拟车模场外的便,按道从终端照入的输读入据序列进数模行管理。拟每一输组入数包括据个三据数:项汽车到达”“或“离去”信息汽车、牌照码号以到及达或去离时的刻。对每一输入数组据行操作后的输出信息为:进若车是辆达到则输,汽车在出车停场或便内道上的停位置;若车是辆车去离则输,汽车在停出场车停留的时内间和交应纳费的(用在便上停留道的时间收不)。费栈以顺结序构实,队列现以表链构实结。现【
测试据数
】 设n =2输入,数据为(‘A:’1,,5,)(A‘,2,’0),(1D’,1,‘51,(‘)A,3’,0)2,‘(A,’,42),5(A’‘,30)5(‘D’,2,,35,)(D’,4‘4,0,(‘E)’,0,)。其0:‘A’表中到达(示rriaal);‘D’v示离表去(epdaturr)e‘E;’表输示结入(e束nd。)【
实现示提】 需另
一设个,栈时停放临给要离为的汽车去让而路从车停退出场来汽车,的用顺也序存储结构现。输实数据按到达入或去的离时刻序有栈中。个元素表每示辆汽一,车含两包数个据项汽车的牌:号照和进码入停场车的刻。
时4.校园导咨询游
【问描述】题
设计个一校园游程序,为来导访的客人
提供种各息信查服询。务
【本要基求】(1
设计)你所在校学校的园面平,所图景点含不于10少个。以图顶点表中校示内园景点各,放景点存名、称号代、简等信介息:以表边示路径存放,路长度径等相信息。
(关)2为访客来提人供图任意中景相关信息点查询的
。3)(来为访客人供提图任中景意点的路查询问即,查任询意两个点景间的一之条短的最简单径。路
测试数【据】
根据实 际况自定情。
【实现示提】
一 般况下情校园的,路道双向通行的,是设可校园面图是一平无个网向顶点。边均含和相有信息。
关