手机
当前位置:查字典教程网 >脚本专栏 >vbs >好玩的vbs特色代码第1/6页
好玩的vbs特色代码第1/6页
摘要:用什么来表示组合?比如从5个数里面选n个数,你怎么用一个数字来表述你的选择结果?注意是一个数字。硬盘的权限就是一个例子,参考脚本手册File...

用什么来表示组合?比如从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下一页阅读全文

【好玩的vbs特色代码第1/6页】相关文章:

TCP版backshell的VBS脚本代码

vbs加administrator用户的代码

禁止QQ上网的vbs代码

利用vbs类实现css按钮的代码

vbs 获取当前目录的实现代码

TXT转HTM、HTML「TXT转网页」的vbs实现代码

使用SAFEARRAY返回的代码

去掉RAR右键解压菜单的VBS代码

将HTML或txt文件转换为ASP输出的vbs代码

获取远程机器共享目录的物理路径的代码

精品推荐
分类导航