5个flash的游戏地址是
http://www.sostart.com/article/view.php/765
此类游戏一般都是通过穷举或者递归之类的方法来求解,对于编成语言来说都比较简单。
这里用SQL语言的CTE递归来玩玩看。我的算法和答案如下:

SQL递归游戏-你厉害吗,来过5关

/*
四个字段分别代表 羊,狼,草,人的位置,0表示河左边,1表示河右边。
每次都必须有人过河,因为动物和植物们都不会划船。
*/
declare@ttable(ybit,lbit,cbit,rbit,pathvarchar(8000))
insertinto@tselect0,0,0,0,''

;witht
as
(
select*,0asccfrom@tunionall
select~y,l,c,~r,path+'人羊'+ltrim(r)+'→',cc+1fromtwherecc<10andy=randy&l&c=0andpathnotlike'%人羊_→'unionall
selecty,~l,c,~r,path+'人狼'+ltrim(r)+'→',cc+1fromtwherecc<10andl=randy&l&c=0andy<>candpathnotlike'%人狼_→'unionall
selecty,l,~c,~r,path+'人草'+ltrim(r)+'→',cc+1fromtwherecc<10andc=randy&l&c=0andy<>landpathnotlike'%人草_→'unionall
selecty,l,c,~r,path+'人'+ltrim(r)+'→',cc+1fromtwherecc<10andy&l&c=0andy<>candy<>landpathnotlike'%人_→'

)
selectREPLACE(REPLACE(path,'0','过河'),'1','返回')aspathfromtwherey&l&c=1

/*
人羊过河→人返回→人草过河→人羊返回→人狼过河→人返回→人羊过河→
人羊过河→人返回→人狼过河→人羊返回→人草过河→人返回→人羊过河→
*/

SQL递归游戏-你厉害吗,来过5关


/*

前五个字段分别代表 左人数,左鬼数,右人数,右鬼数,船位置
船位置为代表在右边,代表在左边
当右边没有人和鬼时(gr+pr>0),不执行返回操作,递归结束
*/
;witht(pl,gl,pr,gr,boat,path)
as
(
select0,0,3,3,cast(0asbit),cast(''asvarchar(8000))unionall
selectpl+2aspl,gl,pr-2aspr,gr,~boat,path+'2人过河→'
fromtwhereboat=0andpr>=2and(pr-2>=grorpr=2)unionall
selectpl+1,gl+1,pr-1,gr-1,~boat,path+'1人鬼过河→'
fromtwhereboat=0andpr>=1andgr>=1andpl>=glunionall
selectpl,gl+2,pr,gr-2,~boat,path+'2鬼过河→'
fromtwhereboat=0andgr>=2and(pl-2>=glorpl=0)unionall
selectpl-1,gl,pr+1,gr,~boat,path+'1人返回→'
fromtwhereboat=1andpl>=1andgr+pr>0and(pl-1>=glorpl=1)andpr+1>=grunionall
selectpl,gl-1,pr,gr+1,~boat,path+'1鬼返回→'
fromtwhereboat=1andgl>=1andgr+pr>0and(pr-1>=grorpr=0)unionall
selectpl-1,gl-1,pr+1,gr+1,~boat,path+'1人鬼返回→'
fromtwhereboat=1andpl>=1andgl>=1andgr+pr>0andpr>=grandpathnotlike'%1人鬼过河→'
)
selectpathfromtwherepr=0andgr=0

/*
2鬼过河→鬼返回→鬼过河→鬼返回→人过河→人鬼返回→人过河→鬼返回→鬼过河→鬼返回→鬼过河→
2鬼过河→鬼返回→鬼过河→鬼返回→人过河→人鬼返回→人过河→鬼返回→鬼过河→人返回→人鬼过河→
1人鬼过河→人返回→鬼过河→鬼返回→人过河→人鬼返回→人过河→鬼返回→鬼过河→鬼返回→鬼过河→
1人鬼过河→人返回→鬼过河→鬼返回→人过河→人鬼返回→人过河→鬼返回→鬼过河→人返回→人鬼过河→
*/

SQL递归游戏-你厉害吗,来过5关

/*
第三关:一家人过河

结果:过河的全部组合有万多中情况,其中满足s之内的有种方法

关联的三个表a b c配合charindex函数分别可以表示出可以过河的两个人和可以返回的一个人
当没有人可以过河则递归自动结束
递归中的case语句可以表示当对岸有个人的时候就不需要返回
*/

declare@ttable(namevarchar(8000),timeint)

insertinto@t
select'瘦人',1union
select'小胖',3union
select'姑娘',6union
select'大胖',8union
select'瘸子',12

;witht(forword_name,time,path)as(

selectreplace(a.name+b.name,c.name,''),b.time+c.time,a.name+b.name+'过河→'+c.name+'返回→'
from@ta,@tb,@tcwherea.time<b.timeandcharindex(c.name,a.name+b.name)>0

unionall

select
casewhenlen(forword_name)<6thenreplace(forword_name+a.name+b.name,c.name,'')elseforword_name+a.name+b.nameend,
casewhenlen(forword_name)<6thent.time+b.time+c.timeelset.time+b.timeend,
casewhenlen(forword_name)<6thenpath+a.name+b.name+'过河→'+c.name+'返回→'elsepath+a.name+b.name+'过河→'end
from@ta,@tb,@tc,twherea.time<b.timeandcharindex(c.name,forword_name+a.name+b.name)>0
andcharindex(a.name,t.forword_name)=0andcharindex(b.name,t.forword_name)=0
)
selectpath,timefromtwherelen(forword_name)=10andtime<=30
/*
瘦人小胖过河→小胖返回→大胖瘸子过河→瘦人返回→瘦人小胖过河→瘦人返回→瘦人姑娘过河→
瘦人小胖过河→小胖返回→大胖瘸子过河→瘦人返回→瘦人小胖过河→瘦人返回→瘦人姑娘过河→
瘦人小胖过河→小胖返回→大胖瘸子过河→瘦人返回→瘦人小胖过河→瘦人返回→瘦人姑娘过河→
瘦人小胖过河→小胖返回→大胖瘸子过河→瘦人返回→瘦人小胖过河→瘦人返回→瘦人姑娘过河→
瘦人小胖过河→小胖返回→大胖瘸子过河→瘦人返回→瘦人小胖过河→瘦人返回→瘦人姑娘过河→
瘦人小胖过河→小胖返回→大胖瘸子过河→瘦人返回→瘦人姑娘过河→瘦人返回→瘦人小胖过河→
...共40行
*/

SQL递归游戏-你厉害吗,来过5关


/*第四关:跳马
*/

declare@ttable(pvarchar(max),xint,yint)
insertinto@t
select'p11',1,1union
select'p12',1,2union
select'p13',1,3union
select'p14',1,4union
select'p21',2,1union
select'p22',2,2union
select'p23',2,3union
select'p24',2,4union
select'p31',3,1union
select'p32',3,2union
select'p33',3,3union
select'p34',3,4union
select'p42',4,2union
select'p43',4,3

;witht(pstart,p,c,x,y)as
(
select p,p,1,x,yfrom@t
unionall
selectt.pstart,t.p+'→'+t_next.p,c+1,t_next.x,t_next.yfrom@tt_next,twhere
(
(abs(t_next.x-t.x)=1andabs(t_next.y-t.y)=2)or
(abs(t_next.x-t.x)=2andabs(t_next.y-t.y)=1) )
and(CHARINDEX(t_next.p,t.p)=0or(c=14andt_next.p=t.pstart))
)
selectpfromtwherec=15

/*
p43→p31→p23→p11→p32→p13→p21→p42→p34→p22→p14→p33→p12→p24→p43
p43→p31→p12→p33→p14→p22→p34→p13→p21→p42→p23→p11→p32→p24→p43
p43→p31→p12→p24→p32→p11→p23→p42→p34→p13→p21→p33→p14→p22→p43
p43→p24→p32→p11→p23→p42→p21→p13→p34→p22→p14→p33→p12→p31→p43
...共112行
*/

SQL递归游戏-你厉害吗,来过5关

;withtas(
select17asf1,26asf2,20asf3,19asf4,31asf5,cast(''asvarchar(8000))aspath
unionallselectf1+8,f2+8,f3,f4,f5,path+'12上→'fromtwheref1<21andf2<21
unionallselectf1+8,f2,f3+8,f4,f5,path+'13上→'fromtwheref1<21andf3<21
unionallselectf1+8,f2,f3,f4+8,f5,path+'14上→'fromtwheref1<21andf4<21
unionallselectf1+8,f2,f3,f4,f5+8,path+'15上→'fromtwheref1<21andf5<21
unionallselectf1,f2+8,f3+8,f4,f5,path+'23上→'fromtwheref2<21andf2<21
unionallselectf1,f2+8,f3,f4+8,f5,path+'24上→'fromtwheref2<21andf4<21
unionallselectf1,f2+8,f3,f4,f5+8,path+'25上→'fromtwheref2<21andf5<21
unionallselectf1,f2,f3+8,f4+8,f5,path+'34上→'fromtwheref3<21andf4<21
unionallselectf1,f2,f3+8,f4,f5+8,path+'35上→'fromtwheref3<21andf5<21
unionallselectf1,f2,f3,f4+8,f5+8,path+'45上→'fromtwheref4<21andf5<21
unionallselectf1-13,f2-13,f3,f4,f5,path+'12下→'fromtwheref1>25andf2>25
unionallselectf1-13,f2,f3-13,f4,f5,path+'13下→'fromtwheref1>25andf3>25
unionallselectf1-13,f2,f3,f4-13,f5,path+'14下→'fromtwheref1>25andf4>25
unionallselectf1-13,f2,f3,f4,f5-13,path+'15下→'fromtwheref1>25andf5>25
unionallselectf1,f2-13,f3-13,f4,f5,path+'23下→'fromtwheref2>25andf2>25
unionallselectf1,f2-13,f3,f4-13,f5,path+'24下→'fromtwheref2>25andf4>25
unionallselectf1,f2-13,f3,f4,f5-13,path+'25下→'fromtwheref2>25andf5>25
unionallselectf1,f2,f3-13,f4-13,f5,path+'34下→'fromtwheref3>25andf4>25
unionallselectf1,f2,f3-13,f4,f5-13,path+'35下→'fromtwheref3>25andf5>25
unionallselectf1,f2,f3,f4-13,f5-13,path+'45下→'fromtwheref4>25andf5>25

unionallselectf1+8,f2+8,f3,f4,f5,path+'12上→'fromtwheref1<21andf2<23andf3between21and25andf4between21and25andf5between21and25
unionallselectf1+8,f2,f3+8,f4,f5,path+'13上→'fromtwheref1<21andf3<23andf3between21and25andf4between21and25andf5between21and25
unionallselectf1+8,f2,f3,f4+8,f5,path+'14上→'fromtwheref1<21andf4<23andf3between21and25andf4between21and25andf5between21and25
unionallselectf1+8,f2,f3,f4,f5+8,path+'15上→'fromtwheref1<21andf5<23andf3between21and25andf4between21and25andf5between21and25
unionallselectf1,f2+8,f3+8,f4,f5,path+'23上→'fromtwheref2<21andf2<23andf3between21and25andf4between21and25andf5between21and25
unionallselectf1,f2+8,f3,f4+8,f5,path+'24上→'fromtwheref2<21andf4<23andf3between21and25andf4between21and25andf5between21and25
unionallselectf1,f2+8,f3,f4,f5+8,path+'25上→'fromtwheref2<21andf5<23andf3between21and25andf4between21and25andf5between21and25
unionallselectf1,f2,f3+8,f4+8,f5,path+'34上→'fromtwheref3<21andf4<23andf3between21and25andf4between21and25andf5between21and25
unionallselectf1,f2,f3+8,f4,f5+8,path+'35上→'fromtwheref3<21andf5<23andf3between21and25andf4between21and25andf5between21and25
unionallselectf1,f2,f3,f4+8,f5+8,path+'45上→'fromtwheref4<21andf5<23andf3between21and25andf4between21and25andf5between21and25
)

selectpathfromt
wheref1between21and25
andf2between21and25
andf3between21and25
andf4between21and25
andf5between21and25

/*
34上→45下→45上→35下→35上→15上→25下→25上→
34上→45下→45上→35下→35上→14上→24下→24上→
34上→35下→35上→45下→45上→15上→25下→25上→
34上→35下→35上→45下→45上→14上→24下→24上→
*/

相关文章:

  • 2021-11-22
  • 2021-06-15
  • 2021-12-18
  • 2021-07-06
  • 2021-04-13
  • 2021-05-13
  • 2021-07-16
  • 2021-09-05
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-09
  • 2021-06-08
  • 2022-12-23
相关资源
相似解决方案