阅读:715回复:6
同时懂C和PASCAL的水友请进来帮个忙(有分!)(问题已解决)
如下问题,请把vb的代码帮忙翻译成c或c++的代码,谢谢 :D
(八数码问题) 8个编有数码1 ̄8的滑牌,能在3*3的井字格中滑动。井 字格中有一格是空格,用0表示,因而空格周围的数码滑牌都可能滑到空格中去. 下图是数码滑牌在井字格中的两种状态: ┎─┬─┬─┒ ┏━┯━┯━┓ ┃2 │8 │3 ┃ ┃1 │2 │3 ┃ ┠─┼─┼─┨ ┠─┼─┼─┨ ┃1 │6 │4 ┃ ----> ┃8 │0 │4 ┃ ┠─┼─┼─┨ ┠─┼─┼─┨ ┃7 │0 │5 ┃ ┃7 │6 │5 ┃ ┗━┷━┷━┛ ┗━┷━┷━┛ 初始状态 目标状态 以左图为初始状态,右图为目标状态,请找出从初始状态到目标状态的滑牌移步序 列,具体要求: (1)输入初始状态和目标状态的数据; a、分别用两行输入上述两项数据: b、对输入数据应有查错和示错功能; (2)实现从初始状态到目标状态的转换(如不能实现,程序应输出不能实现 的提示信息); (3)输出结果,每移动一步都必须在屏幕上显示: a、移动每一步时的序号,最后一步的序号即为移动总步数; b、每一步移动后以3*3表格形式显示状态。 (4)要求能使移动步数尽可能少; program lxw020; uses crt; type a33=array [1..3,1..3] of byte; a4=array [1..4] of shortint; node=record ch:a33; si,sj,pnt,dep:byte; end; const goal:a33=((1,2,3),(8,0,4),(7,6,5)); start:a33=((2,8,3),(1,6,4),(7,0,5)); di:a4=(0,-1,0,1); dj:a4=(-1,0,1,0); var data: array [1..100] of node; temp:node; k,r,ni,nj,closed,open,depth:integer; function check(k:integer):boolean; begin check:=false; ni:=temp.si+di[k]; nj:=temp.sj+dj[k]; if(ni in[1..3])and(nj in[1..3]) then check:=true; if(ni=data[temp.pnt].si)and(nj=data[temp.pnt].sj) then check:=false; end; function dupe:boolean; var i,j,k: integer; buf:boolean; begin buf:=false; i:=0; repeat inc(i); buf:=true; for j:=1 to 3 do for k:=1 to 3 do if data.ch[j,k]<>data[open].ch[j,k] then buf:=false; until buf or (i>=open-1); dupe:=buf; end; function goals:boolean; var i,j:integer; begin goals:=true; for i:=1 to 3 do for j:=1 to 3 do if data[open].ch[i,j]<>goal[i,j] then goals:=false; end; procedure print; var buf: array [1..100] of integer; i,j,k,n:integer; begin n:=1; i:=open; buf[1]:=i; repeat j:=data.pnt; inc(n); buf[n]:=j; i:=j; until i=0; writeln(\'steps:\',depth-1); for i:=1 to 3 do begin for k:=n-1 downto 1 do begin for j:=1 to 3 do write(data[buf[k]].ch[i,j]); if i=2 then write(\'->\') else write(\' \'); end; writeln; end; readln; halt; end; begin{main} closed:=0; open:=1; with data[1] do begin ch:=start; si:=3; sj:=2; pnt:=0; dep:=0; end; repeat inc(closed); temp:=data[closed]; depth:=temp.dep; for r:=1 to 4 do if check(r) then begin inc(open); data[open]:=temp; with data[open] do begin ch[si,sj]:=ch[ni,nj]; ch[ni,nj]:=0; si:=ni; sj:=nj; pnt:=closed; dep:=depth+1; end; if dupe then dec(open) else if goals then print; end; until closed>=open; writeln(\'no solution!\'); readln end. [编辑 - 1/7/04 by jinghuiren] [编辑 - 1/7/04 by jinghuiren] [编辑 - 1/7/04 by jinghuiren] |
|
沙发#
发布于:2004-01-07 17:53
不懂顶
|
|
板凳#
发布于:2004-01-07 20:52
这么快就沉底了!!!
顶一下! |
|
地板#
发布于:2004-01-07 21:33
楼主贴的明明是 PASCAL 的代码嘛。。。
|
|
地下室#
发布于:2004-01-07 23:10
楼主贴的明明是 PASCAL 的代码嘛。。。 PASCAL???? 我同学告诉我是vb,靠,被骗了! 那你能帮忙翻译一下吗? 多谢多谢。 |
|
5楼#
发布于:2004-01-07 23:11
楼主贴的明明是 PASCAL 的代码嘛。。。 已经更正了,各位多帮忙呀。 定重谢! |
|
6楼#
发布于:2004-01-07 23:24
算了,我已经找到相应的vc程序的源代码,不用翻译了。 :D
|
|