集思广益,挑战你的算法水平

wangxianshou 2009-06-05 07:44:40
每次初始化的时候,生成一个m行,n列的棋盘,
单元格上可能有值(int型,最多三位数),
我可以任意修改,删除的话,单元格变为空。
每次操作的时候,你能够获得当前单元格的
行号 e.Row
列号 e.Column
单元格的值 Value(e.Row ,e.Column)
经过任意步操作后
问题:
最后的棋盘布局和初始化的棋盘布局一样吗?
位置和数据都要一样,给出你的判断方法?
1.你可以在每次操作的时候记录你的操作,根据你的操作记录来判断
2.你也可以比较操作前后棋盘的信息
想看看最简单的处理方法?
...全文
32 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hillside 2009-07-16
  • 打赏
  • 举报
回复
简单的办法,就是记下初始值,最后比较。可以建立一个列表,记录下操作单元,比较时忽略未动单元。如果你预计需求将来有可能有进一步的深入,则维护一个操作记录较好。你要写一个新类。维护代码是要有成本的,如果你肯定需求到此为止,就选择简单的。
peng_yaoming 2009-07-16
  • 打赏
  • 举报
回复
哈希表,数组结合、。 12楼说的不错
Yjpgyje 2009-07-15
  • 打赏
  • 举报
回复
学习
wangxianshou 2009-07-15
  • 打赏
  • 举报
回复
大家都提想法啊
CeleryZeng 2009-06-09
  • 打赏
  • 举报
回复
没接触过啊··
算法···好难啊~~~
shield0771 2009-06-09
  • 打赏
  • 举报
回复
如果你要求对比100%可靠的话,12楼的方案比较好
如果不需要100%可靠,可以利用CRC校验、HASH表(或许HASH表也可以找到100%可靠又节约资源的算法,但很难吧)
gao_gao_gao 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 wangxianshou 的回复:]
引用 27 楼 gao_gao_gao 的回复:
定义一个操作数count;
记录棋盘的初始状态;
当一个操作改变了格子的初始状态的时候count++;
当还原的时候count--;
最后判断count的值是否为0,就可以了
这个复杂度不会根据棋盘的变化而改变复杂度


棋盘上的值也是改变的,也需要记录下初始化时单元格的值
但是这个时候并不知道那个地方要改变
全部记录的话,开销也挺大
[/Quote]

棋盘不是一个对象吗,每个格子都有自己的值
只要在初始化完成的时候copy下这个对象就行了.
这是一个牺牲内存求速度的办法.
时间复杂度斯O(1),从算法的角度讲,O(1)就是理想状态了 .
当然有时候还是 复杂了,比如1000个格子,我只改变一次,当然看棋盘快捷了.
zlb789 2009-06-08
  • 打赏
  • 举报
回复
学习
xiedu414 2009-06-08
  • 打赏
  • 举报
回复
MF
wangxianshou 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 gao_gao_gao 的回复:]
定义一个操作数count;
记录棋盘的初始状态;
当一个操作改变了格子的初始状态的时候count++;
当还原的时候count--;
最后判断count的值是否为0,就可以了
这个复杂度不会根据棋盘的变化而改变复杂度
[/Quote]
棋盘上的值也是改变的,也需要记录下初始化时单元格的值
但是这个时候并不知道那个地方要改变
全部记录的话,开销也挺大
gao_gao_gao 2009-06-08
  • 打赏
  • 举报
回复
定义一个操作数count;
记录棋盘的初始状态;
当一个操作改变了格子的初始状态的时候count++;
当还原的时候count--;
最后判断count的值是否为0,就可以了
这个复杂度不会根据棋盘的变化而改变复杂度
shandengx 2009-06-08
  • 打赏
  • 举报
回复
12楼方法比较好...
xiangbupingfan 2009-06-07
  • 打赏
  • 举报
回复
先来看看题目,再想想
ITniao 2009-06-07
  • 打赏
  • 举报
回复
坐标方式..
cainiaoN01 2009-06-07
  • 打赏
  • 举报
回复
难得算法贴·
netstray 2009-06-07
  • 打赏
  • 举报
回复
看来还要加强学习啊
wangxianshou 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wanghui0380 的回复:]
直接散列出整个棋盘hash值做特征值 就可以了,即每操作一步就计算一下hash值
[/Quote]

是把行号列号一起做为键,单元格数据作为相应的键值吗?能否再具体点
wangxianshou 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wartim 的回复:]
看你的题目意思,只想判断棋盘布局是否相同么,既然这么,就不用关心中间是怎么操作的,前后判断一下整个棋盘就是了
[/Quote]
这是最容易想到的,当棋盘很大,但是我只操作了很少的几次,就把前后棋盘比较,
开销会比较大,棋盘小的时候,这个方法还是很不错的
wanghui0380 2009-06-06
  • 打赏
  • 举报
回复
直接散列出整个棋盘hash值做特征值 就可以了,即每操作一步就计算一下hash值
calen 2009-06-06
  • 打赏
  • 举报
回复
gz
加载更多回复(16)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧