| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2043 人关注过本帖, 1 人收藏
标题:问题请教 关于17人围圈问题!
只看楼主 加入收藏
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:0 
模拟过程!~
围圈问题.zip (8.41 KB)
看看吧!~
2009-09-03 20:22
wwj1860
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-8-31
收藏
得分:0 
首先谢谢大家对我提出问题的关注!尤其感谢promising的耐心和细心,只是当时设置该题时分值较少了些,所以。。。。。还望各位见谅,
另外对于promising提出的问题给出我的思路及代码,前面的步骤我演算过了,还算正确,只是最后一步打印的结果不符,我想不通!还望指教!
思路如下:
首先定义一个足够长的数组,a(100),定义s,并赋初值为17,用来记录数值中元素个数
定义两个新的变量 初值(chuzhi)终值(zongzhi)用来控制把新的数组接到原数组a(1)~a(17)的尾部
对数组初始化(我把数组从a(1)开始赋值,把通过运算最后得到的结果减1)
a(1)a(2)a(3)a(4)a(5)a(6)a(7)a(8)a(9)a(10)a(11)a(12)a(13)a(14)a(15)a(16)a(17)
 1    2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17

do循环开始
判断 s是否为1 不为1 执行下面步骤
把对能被三整除的数组下标所标的元素置零,并每置零一次把计数器减一
(第一次)
a(1)a(2)a(3)a(4)a(5)a(6)a(7)a(8)a(9)a(10)a(11)a(12)a(13)a(14)a(15)a(16)a(17)
 1    2   0   4   5   0   7   8   0   10   11    0   13   14    0  16   17
通过循环判断a(i)的值 若为零,则该元素后面的元素依次前移 得到新数组
a(1)a(2)a(3)a(4)a(5)a(6)a(7)a(8)a(9)a(10)a(11)a(12)a(13)a(14)a(15)a(16)a(17)  
 1    2   4   5   7   8  10  11  13   14   16   17   0    0     0    0    0
把得到的新数组结尾(把上次循环变量i的终值赋值给chizhi,把i+s-1 赋值给zongzhi)
用 for i= chuzhi to zongzhi
 a(i)=(i-chuzhi+1)
next i 完成结尾
得到
a(1)a(2)a(3)a(4)a(5)a(6)a(7)a(8)a(9)a(10)a(11)a(12)a(13)a(14)a(15)a(16)a(17)   
 1    2   4   5   7   8  10  11  13   14   16   17   0    0     0    0    0
a(18)a(19)a(20)a(21)a(22)a(23)a(24)a(25)a(26)a(27)a(28)a(29)   
   1    2   4     5   7     8   10   11   13   14   16   17  
然后再仅对接在尾部的新数组以下标来作为新报数(范围chuzhi到zongzhi),并判断该报数是否能被3整除(对于a(1)~a(17)不再做任何处理)再回头进行 do 循环 直到 s=1
最后打印最后一次得到数组中那个不为零的数组元素减一的值 ,即是它原来的位置
我的代码如下:

Private Sub Form_Click()
Dim s As Integer  '用于计数,记录数值中元素不为零的个数
Dim j As Integer, i As Integer '定义两个循环变量
Dim chizhi As Integer, zongzhi As Integer '定义用于把每次处理的数组接在上次数组尾部初值与终值
Dim a(100) As Integer '定义一个足够大的数组,用来存储原数组和要拼接在尾部的新数组
For i = 1 To 17 '为数组循环赋值
a(i) = i
Next i
s = 17
zongzhi = 17
chuzhi = 1
Do While s <> 1
For i = chuzhi To zongzhi '通过循环找出能被三整除的报号(即a数组的下标),把以该报号为下标的数组元素赋值为零
  If i Mod 3 = 0 Then
   a(i) = 0
   s = s - 1
  End If
Next i
For i = chuzhi To zongzhi '通过循环判断数组a中元素是否为零,若为零把该元素后面的元素依次前移
  If a(i) = 0 Then
     For j = i To zongzhi
      a(j) = a(j + 1)
     Next j
  End If
Next i
chuzhi = i '为要接在原数组尾部的经过处理的新数组,定义下标初值
zongzhi = i + s - 1 '为要接在原数组尾部的经过处理的新数组,定义下标终值
For j = chuzhi To zongzhi '用循环把新数组接在原数组尾部
a(j) = a(j - chuzhi + 1)
Next j
Loop
Print a(j) - 1
End Sub



2009-09-03 20:22
wwj1860
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-8-31
收藏
得分:0 
刚才回复中的s是记录非零元素的个数
2009-09-03 20:24
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
回复 19楼 promising

我的编号是从 1 到 17 的,看DEBUG 结果就可以看得出.
第一次,取走了第3位的,

 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3
每一行一共是 18 个数字.
其中前 17 个数字表示 1 到 17 的编号, =1 ,表示人在,=0 人不在
最后一个数字,表示本轮取走的人的编号.

授人于鱼,不如授人于渔
早已停用QQ了
2009-09-04 10:29
promising
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
帖 子:87
专家分:147
注 册:2009-8-31
收藏
得分:0 
回复 25楼 风吹过b
恩,所以说此题的答案是10号吧。(0,1,2,……16)
请不要怪我,过于注重这个问题的答案。

向前走着……
2009-09-04 10:46
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
只要运行结果对了就没问题。
你们注意看了我数组定义的部分,就不会问我编号是几了。
我的数组定义是
dim W(1 to 17) as long

明确指出数组最小下标是 1 ,最大下标是 17
也就是 1-17

我当时也是怕算出结果不对,所以才 显示每一步的详细状态。
第一次测试时,只计算向后点不能超过一个轮次,结果发现此法不通,会生成二个结果  4 和 11 。
才使用计数剩余人数来决定是否取完了人。


授人于鱼,不如授人于渔
早已停用QQ了
2009-09-04 10:54
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
我习惯用 过程 、 函数解决问题,所以对
bczgvip 用类来解决问题比较 生疏 ,有点看不懂,不作评论。
另外对移位法也稍微偿试了一下,发现系统运算时间主要消耗在 移位上面了。
我的方法,运算时间主要消耗在 +1 的循环上面了。

授人于鱼,不如授人于渔
早已停用QQ了
2009-09-04 10:59
hellowql
Rank: 2
来 自:安徽 合肥
等 级:论坛游民
帖 子:40
专家分:12
注 册:2009-4-25
收藏
得分:0 
Dim i, j, k, s1, w, x(17) As Byte
For i = 1 To 17
    x(i - 1) = i
Next i
For i = 17 To 2 Step -1
    s1 = (s1 + 3 - 1) Mod i
    If s1 = 0 Then s1 = i
        w = x(s1 - 1)
    For j = s1 To i - 1
        x(j - 1) = x(j)
    Next j
        x(i - 1) = w
Next i
Print x(0)
x(0)=10 即位置号为10的人,也就是第11个人。
2009-09-04 15:05
lz2644
Rank: 2
等 级:论坛游民
帖 子:28
专家分:20
注 册:2009-8-27
收藏
得分:0 
回帖切磋是一种美德,每天回帖即可获得10分可用分

可是呢,然后呢... 
2009-11-23 14:49
gdc123
Rank: 1
等 级:新手上路
帖 子:26
专家分:7
注 册:2008-8-8
收藏
得分:0 
经修改,能运行:

Private Sub Form_Click()
Dim s As Integer, t As Integer
Dim j As Integer, i As Integer
Dim chizhi As Integer, zongzhi As Integer
Dim a(100) As Integer
For i = 1 To 17
a(i) = i
Next i
s = 17
zongzhi = 17
chuzhi = 1
Do While s <> 1
t = s
For i = chuzhi To zongzhi
  If i Mod 3 = 0 Then
   a(i) = 0
   s = s - 1
  End If
Next i
For i = chuzhi To zongzhi
  If a(i) = 0 Then
     For j = i To zongzhi
      a(j) = a(j + 1)
     Next j
  End If
Next i
chuzhi = i
zongzhi = i + s - 1
Print chuzhi, zongzhi

For j = chuzhi To zongzhi
a(j) = a(j - t)
Print a(j);
Next j
Print
Print
Loop
Print "编号为: " & a(j - 1) - 1
End Sub
2009-11-30 08:51
快速回复:问题请教 关于17人围圈问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018690 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved