ssikkiss 发表于 2010-1-27 18:23:37

再问一个问题!

遇到一个问题,开始我以为很好实现,结果很麻烦:
有A,B两个人,外加一个x*y的棋盘,n个相同的石子,A做如下的事:
[*]把棋盘打扫干净。[*]把n个石子按他自己的心意摆放在棋盘上[*]重复步骤1.

而B要做的可以选择以下2种:[*]监视A的每一次摆放,一旦发现A连续有100次在棋盘的同一个位置摆放石子,提醒A;[*]对A的每一次摆放,对A的摆放打分,然后分数反馈给A,以便A参考。打分的依据:对每个石子,连续出现在同一点的次数越多则分数越低。(注意石子是相同的。)
(注:假设A要摆放100000次,并不是在A摆放完了B才通知A。对第1题,只要且仅要A有某个连续100次在同一点的石子,就通知A;对第2题,则A每摆一次,都要通知A的得分。)


问题:
请问 B如何实现这2项任务?

KeyTo9_Fans 发表于 2010-1-27 21:47:15

只要维护两张列表即可。

第一张表是A上次放的坐标:

$(x_1,y_1),(x_2,y_2),(x_3,y_3),...,(x_n,y_n)$

第二张表是A这次放的坐标:

$(X_1,Y_1),(X_2,Y_2),(X_3,Y_3),...,(X_n,Y_n)$

如果x*y不大,可以用一个二维数组记录每个位置的连续摆放次数。

步骤如下:

把第二张表对应的位置全部标记并把该位置的连续摆放次数加1(对于问题1,满100给提示;对于问题2,记录最大值)。

逐个检查第一张表对应的位置:如果该位置未作标记,则该位置的连续摆放次数清零,否则不做任何操作。

根据第二张表把之前所作的标记去掉。

把第二张表的内容覆盖到第一张表上。

读入A下一次的摆放坐标,记录到第二张表上。

以上步骤重复执行。

如果x*y太大,以至于无法用二维数组记录每个位置的连续摆放次数,那么给两张表排序。

对于第二张表,按顺序检查里面的坐标是否也在第一张表中。

如果在,那么当前位置的连续摆放次数根据第一张表的记录加1得到;

否则记当前位置的连续摆放次数为1。

把第二张表中的坐标以及连续摆放次数的记录覆盖到第一张表中。

读入A下一次的摆放坐标,记录到第二张表上。

重复以上步骤。

没有不好实现的地方,也没有很麻烦的地方。

不知道楼主遇到了什么问题。

ssikkiss 发表于 2010-1-28 16:30:03

谢谢!今天已经想到了办法,我是记录一个x*y大小的数组来实现。
不过看到了版主的回答,才觉得此帖没有白写,哈哈,居然用两个小的数组就解决了!
页: [1]
查看完整版本: 再问一个问题!