主题:PLEASE HALP “八国圆桌问题”
神倪在世
[专家分:30] 发布于 2008-10-27 17:41:00
在一次宴会上,有来自八个不同国家的宾客被安排在同一张圆桌就坐。A是中国人,会讲英语;B是意大利人,能讲西班牙语;C是英国人,会讲法语;D是日本人,能讲汉语;E是法国人,会讲德语;F是俄国人,懂意大利语;G是西班牙人,能讲日语;H是德国人,懂俄语。编程序安排他们的座位,使他们在各自的座位上能方便地跟两旁的客人交谈。
[fly]请帮助,急用,谢谢!!![/fly]
最后更新于:2008-10-28 17:17:00
回复列表 (共22个回复)
沙发
imjohnzj [专家分:1490] 发布于 2008-10-27 23:10:00
第一步:
先请楼主说说你是怎么想的?
目前用的是什么思路?
第二步:
请楼主提供出自己的代码。
包括写了一半的代码。
第三步:
说明一下,楼主在什么地方卡住了。
困难是什么,困难在哪里?
做到以上三步,小弟我才相信楼主的贴不是“作业贴”
小弟我反对 不劳而获 的“作业贴”
原因是:写代码,调试代码,很繁,很辛苦的。
板凳
imjohnzj [专家分:1490] 发布于 2008-10-27 23:14:00
先告诉你答案是什么:
ACEHFBG
3 楼
神倪在世 [专家分:30] 发布于 2008-10-28 17:16:00
我可不是那种人
4 楼
神倪在世 [专家分:30] 发布于 2008-10-28 17:25:00
CLS
FOR a = 1 TO 8: FOR b = 1 TO 8: FOR c = 1 TO 8
FOR d = 1 TO 8: FOR e = 1 TO 8: FOR f = 1 TO 8
FOR g = 1 TO 8: FOR h = 1 TO 8
IF a * b * c * d * e * f * g * h = 40320 THEN
IF ABS(a - d) = 1 AND ABS(a - c) = 1 THEN
IF ABS(b - f) = 1 AND ABS(b - g) = 1 THEN
IF ABS(c - e) = 1 AND ABS(d - g) = 1 THEN
IF ABS(e - h) = 1 AND ABS(f - h) = 1 THEN
PRINT a; b; c; d; e; f; g; h
END IF
END IF
END IF
END IF
END IF
NEXT h, g, f, e, d, c, b, a
END
我就是这样想的,但没有运行结果。请问哪儿错了?
5 楼
神倪在世 [专家分:30] 发布于 2008-10-28 17:27:00
数学是我最拿手的,用数学解很简单。
6 楼
imjohnzj [专家分:1490] 发布于 2008-10-28 20:17:00
关于你代码里什么问题嘛,小弟我看不出来哦。
其实,跟本就看不懂啊。
因为小弟我数学不如你那么拿手哦。
没法办,答案用摸的吧。
所以,小弟我是在想,先把中国人的位置写下了。
理论上是谁先定下来都可以的,但是小弟是中国人,所以就中国人优先了(中国人帮中国人嘛)哈哈。
小弟的思路如下:
A 是中国人,会讲英语;
B 是意大利人,能讲西班牙语;
C 是英国人,会讲法语;
D 是日本人,能讲汉语;
E 是法国人,会讲德语;
F 是俄国人,懂意大利语;
G 是西班牙人,能讲日语;
H 是德国人,懂俄语。
小弟把不同的国家用不同的数字表示:例中国,汉语都用 1 表示:
A:1,3;
B:2,7;
C:3,5;
D:4,1;
E:5,8;
F:6,2;
G:7,4;
H:8,6。
把上面的结果用数组存起来:
dim Guest(1 to 8, 1 to 2)
Guest(1,1)=1: Guest(1,2)=3
...
因为上面的结果中,纵向的数是按次序的。
所以,直接把数组按下面的来存:
dim Guest( 1 to 8 )
Guest(1) = 3
Guest(2) = 7
Guest(3) = 5
Guest(4) = 1
Guest(5) = 8
Guest(6) = 2
Guest(7) = 4
Guest(8) = 6
要不就:
dim Guest( 1 to 8 )
for i = 1 to 8
Read Guest(i)
next i
DATA 3, 7, 5, 1, 8, 2, 4, 6
接下来,就按人所会的语言来先边上坐什么人了。
这道题设计得很巧妙,所有来宾的国籍与会的语言都可以形成一个圈。
所以,只要人的顺序决定下来,从哪里开始坐,方向如何都没有关系了。
dim id, cnt
id = 1 '第一个人随便坐。
while cnt < 8
print chr$(64 + id);
id = Guest(id)
cnt = cnt + 1
wend
好了,所以的代码为:
dim Guest( 1 to 8 )
for i = 1 to 8
Read Guest(i)
next i
DATA 3, 7, 5, 1, 8, 2, 4, 6
dim id, cnt
id = 1 '第一个人随便坐。
while cnt < 8
print chr$(64 + id);
id = Guest(id)
cnt = cnt + 1
wend
输出:ACEHFBGD
哈哈,和之前我给出的答案不一样。
代码的输出:ACEHFBGD
我自己算的:ACEHFBG (三楼的)
哈哈,我少算了个 D 哦。
7 楼
imjohnzj [专家分:1490] 发布于 2008-10-28 20:17:00
dim Guest( 1 to 8 )
for i = 1 to 8
Read Guest(i)
next i
DATA 3, 7, 5, 1, 8, 2, 4, 6
dim id, cnt
id = 1 '第一个人随便坐。
while cnt < 8
print chr$(64 + id);
id = Guest(id)
cnt = cnt + 1
wend
8 楼
imjohnzj [专家分:1490] 发布于 2008-10-28 20:27:00
Bye the Way:
运行的速度很快哦。
9 楼
神倪在世 [专家分:30] 发布于 2008-10-28 21:10:00
你能不自己计算而直接用程序计算出来吗?虚心请教。
10 楼
imjohnzj [专家分:1490] 发布于 2008-10-28 22:08:00
我没有自己计算啊。
在写程序之前,我把不同的国家及语言做了编号。
然后就存进数组里面了。
我一点都没有参于计算哦。
但是,小弟明白一个道理(不一定做得到)
一个问题:
适当的编码,
然后加上合适的数据结构,
最后再用对应的操作。
可以大大提升程序的效率和质量。
我来回复