我自己写的代码很笨重,主要是搜索下一开始位置时,是逐行扫描的,效率不高.
而且,我没有用数组,用的游标,因为在vfp环境下,我认为没有哪个数组能比游标效率更高了.
如果你用C,VB,java,Python,用数组/列表 这些模型,都可以讨论.
我的代码如下:
程序代码:
CLEAR
CLOSE TABLES ALL
CREATE CURSOR TT (ID i ,cname c(1) ,XH I ,ALIFE L,memo1 c(20))
LOCAL II AS Integer ,icnt as Integer ,ilc as Integer ,ilocate as Integer
* 建立初始模型,顺便模拟首轮排序。
FOR II = 65 TO 73
INSERT INTO TT (ID,cname,XH,ALIFE) VALUES (II - 64,CHR(II) ,II - 64,.T.)
ENDFOR
ilc =1 && 第?轮
SELECT tt
COUNT FOR alife TO icnt
DO WHILE icnt > 1
IF ilc =1 THEN && 确定开始位置
ilocate=SetOrder(1)
ELSE
ilocate=SetOrder(ilocate)
ENDIF
* 处理本轮退出的.
LOCATE FOR xh = 5 AND alife
IF FOUND() THEN
REPLACE alife WITH .f. ,memo1 WITH '第' + LTRIM(STR(ilc)) + '轮退出'
? '第' + LTRIM(STR(ilc)) + '轮,' + cname + '同学退出...下一轮将从ID=' + ;
LTRIM(STR(ilocate)) + '的' + CHR(ilocate + 64) + '同学开始...'
ELSE
? 'Error ... 意外情况'
ENDIF
ilc = ilc + 1
COUNT FOR alife TO icnt
IF icnt = 1 THEN
LOCATE FOR alife
? '目前在第' + LTRIM(STR(ilc)) + '轮,只剩下' + cname + '同学一人,游戏结束.'
EXIT
ENDIF
ENDDO
FUNCTION SetOrder(startxh) as Integer
* 参数:1开始的位置
LOCAL ncnt as Integer
LOCAL ilot as Integer
LOCAL lfund as Boolean
SELECT tt
REPLACE xh WITH 0 FOR alife
COUNT FOR alife TO ncnt
IF ncnt >1 THEN
IF startxh > RECCOUNT() THEN
GO 1
ELSE
GO startxh
ENDIF
ii = 1
DO WHILE ii< 6
IF alife THEN
REPLACE xh WITH ii
ii = ii + 1
SKIP
IF EOF() THEN
GO 1
ENDIF
ELSE
* 后面几轮,会进入这个分支
SKIP
IF EOF() THEN
GO 1
ENDIF
ENDIF
ENDDO
* 返回下次应开始的位置:
LOCATE FOR xh = 5 AND alife
IF FOUND() THEN
ilot = id && 暂时的
DO WHILE lfund =.f.
IF alife AND xh<> 5 THEN
ilot = id
lfund =.t.
ELSE
SKIP
IF EOF() THEN
GO 1
ENDIF
ENDIF
ENDDO
RETURN ilot
ENDIF
ELSE
* 说明只剩下最后一个了,不再循环,因为没有意义了.
RETURN 0
ENDIF
ENDFUNC