再问一个问题!
遇到一个问题,开始我以为很好实现,结果很麻烦:有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项任务? 只要维护两张列表即可。
第一张表是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下一次的摆放坐标,记录到第二张表上。
重复以上步骤。
没有不好实现的地方,也没有很麻烦的地方。
不知道楼主遇到了什么问题。 谢谢!今天已经想到了办法,我是记录一个x*y大小的数组来实现。
不过看到了版主的回答,才觉得此帖没有白写,哈哈,居然用两个小的数组就解决了!
页:
[1]