用什么来表示组合?比如从5个数里面选n个数,你怎么用一个数字来表述你的选择结果?注意是一个数字。
硬盘的权限就是一个例子,参考脚本手册FileSystem文件Attributes属性部分:
Normal0普通文件。不设置属性。
ReadOnly1只读文件。属性为读/写。
Hidden2隐藏文件。属性为读/写。
System4系统文件。属性为读/写。
Volume8磁盘驱动器卷标。属性为只读。
Directory16文件夹或目录。属性为只读。
Archive32文件在上次备份后已经修改。属性为读/写。
Alias64链接或者快捷方式。属性为只读。
Compressed128压缩文件。属性为只读。
如果选择了其中任意几个数字相加,比如得到65,那么你选择的肯定是1和64的组合,vbs里面的And运算符还对两个数值表达式中位置相同的位执行逐位比较,如果1and65得到的是1那么说明65可以表示你的选择里面含有1,如果是0则没有。
还有一个的问题是:链表型的数据结构如何描述,一个表型的数据,可以根据行索引,可以方便增加删除行,并且增加数据前判断一行是否重复。而且代码不是特别多,速度不是特别慢,运行过程可以把数据显示出来供程序员调试?
在vbs里面可以利用dictionary来模拟,Item项是一个一维数组。
这两种个数据结构的原理我用到了一个游戏题目里:
<style>
body,td{font-size:12px;}
table{border:1pxsolidlightblue;border-collapse:collapse;width:100%;}
</style>
四人欲过一座河,且只有一个氧气瓶(每次最多能容两人同时游过).<br/>
甲单独过河需1分钟,乙需2分钟,丙需5分钟,丁需7分钟.则四人全部通过的最短时间是多少.<br/>
<buttononclick="vbs:try">过河</button>
<pid="ppp"></p>
<SCRIPTLANGUAGE="vbScript">
'本题属于决策树类型问题
'难点在于数据的描述上
'决策树的数据关键是:初始状态,操作步骤,结束状态
'每次递归的输入值--初始状态,是上次运算的结果--结束状态
'因此经过反复推敲,决定用:岸边状态+操作步骤编码+时间结果+开关状态来描述
'技巧:关于搭档方式的描述,采用2的n次方相加,实现用一个数来表示2个数搭配的目的
'比如01搭档,那么表示方法就是2^0+2^1=3职能是01搭配才会产生,绝对不会是其他数字
'见partner函数
personTime=Array(1,2,5,7)'每个人花费时间
startBank="0123"'用空格分开表示河左岸的人的状态
setsolution=CreateObject("Scripting.Dictionary")'
'用一个结构体来描述数据,每行的格式如下:
'solution.AddP,Array(onceTime,lBank,rBank,0)
subtry
'点按钮开始递归调用
ifsolution.Count=0then
setsolution=gogo("",0,startBank)
else
ifisFinish(solution)then
succeed
exitsub
else
setsolution=aa(solution)
endif
endif
showsolution
endsub
functiongogo(K,T,L)
'输入:K步骤序列string
'输入:T上步骤执行时间int
'输入:L可选择的人员名单string
'输出:返回后的结构体Dictionary
setscheme=CreateObject("Scripting.Dictionary")
dimtempArr:tempArr=split(L)
n=n+1
foreachiintempArr
foreachjintempArr
ifi<>jthen
onceTime=maxTime(i,j)+T
P=trim(K&""&partner(i,j))
rBank=trim(otherBank(L)&""&i&""&j)
lBank=otherBank(rBank)
ifnotscheme.Exists(P)then
scheme.AddP,Array(onceTime,lBank,rBank,0)
endif
endif
next
next
setgogo=scheme
endfunction
functionaa(D)
'输入:结构体Dictionary
'输出:返回后的结构体Dictionary
setscheme=CreateObject("Scripting.Dictionary")
foreachKinD.Keys
T=D.Item(K)(0)
bool=D.Item(K)(3)
'alertK
ifcbool(bool)then
L=D.Item(K)(1)
linkgogo(K,T,L),scheme
else
L=D.Item(K)(2)
linkback(K,T,L),scheme
endif
next
setaa=scheme
endfunction
'setD=CreateObject("Scripting.Dictionary")
'D.Exists(
sublink(D1,D2)
'输入:D1结构体Dictionary
'输入返回:D2结构体Dictionary
foreachKinD1.Keys
ifnotD2.Exists(K)thenD2.addK,D1.Item(K)
next
endsub
functionback(K,T,L)
'输入:K步骤序列string
'输入:T上步骤执行时间int
'输入:L可选择的人员名单string
'输出:返回后的结构体Dictionary
setscheme=CreateObject("Scripting.Dictionary")
dimtempArr:tempArr=split(L)
foreachiintempArr
onceTime=personTime(cint(i))+T
P=trim(K&""&i)
lBank=otherBank(L)&""&i
rBank=otherBank(lBank)
scheme.AddP,Array(onceTime,lBank,rBank,1)
next
setback=scheme
endfunction
functionremove(L,i)
'输入:L人员名单string
'输入:i被移出人的编号int
'输出:移出后的人员名单string
L=L&""
L=replace(L,i&"","")
remove=trim(L)
endfunction
functionotherBank(L)
'输入:这岸的名单string
'输出:得到另外一个岸边的名单string
tempArr=split(L)
LL=startBank
foreachiintempArr
LL=remove(LL,i)
next
otherBank=LL
endfunction
functionmaxTime(x,y)
'输入:x,y人的编号int
'输出:得到两个人一次过河的最大时间int
a=personTime(cint(x))
b=personTime(cint(y))
ifa>bthenmaxTime=aelsemaxTime=b
endfunction
functionPtoMan(P)
'输入:P单个方案string
'输出:由两个人名组合的方案string
dimtempStr
dimbound:bound=ubound(personTime)
fori=0tobound
forj=0tobound
ifi<>jand(partner(i,j)=P)then
tempStr=i&""&j
exitfor
exitfor
endif
next
next
PtoMan=tempStr
endfunction
functionPforRead(P)
'输入:P有空格分隔的方案序列string
'输出:可读懂的方案序列string
tempArr=split(P)
dimtempStr
fori=0toubound(tempArr)
if(imod2)=0then
tempStr=tempStr&PtoMan(tempArr(i))&"过去"
else
tempStr=tempStr&tempArr(i)&"回来"
endif
next
PforRead=tempStr
endfunction
functionpartner(x,y)
'输入两个数,代表组合唯一值,存放到字符串里int
'输出:
a=cint(x)
b=cint(y)
partner=cstr(2^a+2^b)
endfunction
subshow(D)
'输入:D字典Dictionary
'显示字典中的内容
dimi:i=1
re="<tableborder=1>"
re=re&"<tr><td>行号</td><td>过河方案</td><td>花费时间</td><td>左岸状态</td><td>右岸状态</td><td>过河开关</td></tr>"
foreachkeyinD.Keys
re=re&"<tr><td>"&i&"</td><tdtitle='"&key&"'>"&PforRead(key)&"</td>"
foreachainD.Item(key)
re=re&"<td>"&a&"</td>"
next
re=re&"</tr>"
i=i+1
next
re=re&"</table>"
ppp.innerHTML=re
endsub
functionD2Arr(D)
'输入:D字典Dictionary
'输出:时间结果数组,第一个元素设置为极小,不参与排序,array
dimkArr:kArr=D.keys
dimtempArr():redimtempArr(ubound(kArr)+1)
tempArr(0)=0
fori=0toD.count-1
tempArr(i+1)=D.Item(kArr(i))(0)
next
D2Arr=tempArr
endfunction
subsortA(Arr)
'输入:Arr时间结果数组array
'堆排序,复杂度n*log(n)/log(2),如果8个数就是24次,如果用冒泡是8^2=64次
dimn,i,L,ir,rArr,j
n=ubound(Arr)
L=int(n/2)+1
ir=n
do
ifL>1then
L=L-1
rArr=Arr(L)
else
rArr=Arr(ir)
Arr(ir)=Arr(1)
ir=ir-1
ifir=1then
Arr(1)=rArr
exitsub
endif
endif
i=L
j=2*L
whilej<=ir
ifj<irthen
ifArr(j)<Arr(j+1)thenj=j+1
endif
ifrArr<Arr(j)then
Arr(i)=Arr(j)
i=j
j=2*j
else
j=ir+1
endif
wend
Arr(i)=rArr
loop
endsub
subsucceed()
'成功后提示
dimtempArr:tempArr=D2Arr(solution)
sortAtempArr
alert"已经结束!最小值是:"&tempArr(1)
setRows=ppp.getElementsByTagName("TR")
fori=0toRows.length-1
iftrim(Rows(i).cells(2).innerText)=cstr(tempArr(1))then
Rows(i).style.backgroundColor="red"
endif
next
endsub
functionisFinish(D)
'输入:D返回后的结构体Dictionary
'输出:是否完成的状态bool
dimre:re=false
ifD.Count>0then
dimtempArr:tempArr=D.Keys
dimK:K=tempArr(0)
iftrim(D.Item(K)(1))=""thenre=true
endif
isFinish=re
endfunction
</SCRIPT>
当前1/6页123456下一页阅读全文