请教高手填数字游戏算法

zhongsuquan 2009-07-08 09:35:30
由于不好画格子,只好用下面矩阵表示。假如下面是5行5列的格子,每个格子里面的数字只能是1或0,可以求得每行每列的数字和。但是反过来能否由已知的每行每列之和求出各格子里面的数字(X表示未知处)?此解是唯一的吗?请高手给出算法步骤,谢谢!!

(行之和)
1 X X X X 3

X X X X X 2

X 0 X X 0 1

X 1 X 0 X 1

1 0 X X 0 3


2 1 3 3 1 (列之和)
...全文
128 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
线性代数的知识,可以去看看...有关方程的解和矩阵的关系
zhongsuquan 2009-07-15
  • 打赏
  • 举报
回复
确实不错![Quote=引用 21 楼 litaoye 的回复:]
如果已经放了,应该是放到排在后面的列里。以 为例

0111:3
1000:1
1000:1
1000:1
----
3111

先按照行排,3最大,共3个,依次放到排在前3的列中,1110

剩下的行中最大的为1,此时,对应的列的值为2001,先放到2里,
1000
剩下的行中最大的为1,此时,对应的列的值为1001,先放到2里,
1000
剩下的行中最大的为1,此时,对应的列的值为0001,放到1里,
0001

=>
1110
1000
1000
0001

[/Quote]
showjim 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 litaoye 的回复:]
如果已经放了,应该是放到排在后面的列里。以 为例

0111:3
1000:1
1000:1
1000:1
----
3111

先按照行排,3最大,共3个,依次放到排在前3的列中,1110

剩下的行中最大的为1,此时,对应的列的值为2001,先放到2里,
1000
剩下的行中最大的为1,此时,对应的列的值为1001,先放到2里,
1000
剩下的行中最大的为1,此时,对应的列的值为0001,放到1里,
0001

=>
1110
1000
1000
0001

[/Quote]
顶,确实是好办法,上面误解你的意思了.
绿色夹克衫 2009-07-13
  • 打赏
  • 举报
回复
如果已经放了,应该是放到排在后面的列里。以 为例

0111:3
1000:1
1000:1
1000:1
----
3111

先按照行排,3最大,共3个,依次放到排在前3的列中,1110

剩下的行中最大的为1,此时,对应的列的值为2001,先放到2里,
1000
剩下的行中最大的为1,此时,对应的列的值为1001,先放到2里,
1000
剩下的行中最大的为1,此时,对应的列的值为0001,放到1里,
0001

=>
1110
1000
1000
0001

可以用优先队列来做

[Quote=引用 19 楼 sbwwkmyd 的回复:]
引用 17 楼 litaoye 的回复:

先将1放到行之和最大的那一行,同时又是列之和最大的那一列,依次往下放就可以,用这个方法也可以比较快的得出一个无解的判断。

0111:3
1000:1
1000:1
1000:1
----
3111
比如这种情况,我认为会存在难以确认的时候,比如最大行最大列相交处已经放了一个1怎么办?这种方法,大数会慢慢接近小数,当有多个数相等时怎么办?我认为用这种方法要确认是否有解是一定困难的.

引用 18 楼 sbwwkmyd 的回复…
[/Quote]
绿色夹克衫 2009-07-13
  • 打赏
  • 举报
回复
确实会有这样的情况,而且例子应该很多,就好像a+b+c+d+e >= 5,a,b,c,d,e 都 <= 1
这样的线性不等式竟然有唯一解,即a=b=c=d=e=1

解的区间依赖于约束的松或紧,用贪心来解,相当于尽量放低对解的约束,因此可以相对较快的求出一个解,
但同样存在只有一个解,甚至无解的情况。

[Quote=引用 18 楼 sbwwkmyd 的回复:]
引用 17 楼 litaoye 的回复:

约束条件为2*n个,变量有n^2个,n > 1时,解肯定不唯一,这种情况下,求1个解的话,用贪心就可以,
先将1放到行之和最大的那一行,同时又是列之和最大的那一列,依次往下放就可以,用这个方法也可以比较快的得出一个无解的判断。

另外还有些快速进行无解判断的方法,比如和不能>n,且列之和等于行之和。

有一点点不同意,解重复不知道算不算唯一?比如:
000
110
000
这样的结果.解唯一的情况…
[/Quote]
showjim 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 litaoye 的回复:]
先将1放到行之和最大的那一行,同时又是列之和最大的那一列,依次往下放就可以,用这个方法也可以比较快的得出一个无解的判断。
[/Quote]
0111:3
1000:1
1000:1
1000:1
----
3111
比如这种情况,我认为会存在难以确认的时候,比如最大行最大列相交处已经放了一个1怎么办?这种方法,大数会慢慢接近小数,当有多个数相等时怎么办?我认为用这种方法要确认是否有解是一定困难的.

[Quote=引用 18 楼 sbwwkmyd 的回复:]
解唯一的情况应该是任意两行无法或两列无法进行等和的10互换,简单一点就是不能出现
0...1
.....
1...0

1...0
.....
0...1
这样的双对角模型.
[/Quote]
如果只要求一个解,我会抓住这个特征,让我的搜索序列中只出现
01
10
这种结构,而
10
01这种结构是被排斥的,因为它们可以相互转换.
showjim 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 litaoye 的回复:]
约束条件为2*n个,变量有n^2个,n > 1时,解肯定不唯一,这种情况下,求1个解的话,用贪心就可以,
先将1放到行之和最大的那一行,同时又是列之和最大的那一列,依次往下放就可以,用这个方法也可以比较快的得出一个无解的判断。

另外还有些快速进行无解判断的方法,比如和不能>n,且列之和等于行之和。
[/Quote]
有一点点不同意,解重复不知道算不算唯一?比如:
000
110
000
这样的结果.解唯一的情况应该是任意两行无法或两列无法进行等和的10互换,简单一点就是不能出现
0...1
.....
1...0

1...0
.....
0...1
这样的双对角模型.
df274119386 2009-07-13
  • 打赏
  • 举报
回复
学习
绿色夹克衫 2009-07-13
  • 打赏
  • 举报
回复
约束条件为2*n个,变量有n^2个,n > 1时,解肯定不唯一,这种情况下,求1个解的话,用贪心就可以,
先将1放到行之和最大的那一行,同时又是列之和最大的那一列,依次往下放就可以,用这个方法也可以比较快的得出一个无解的判断。

另外还有些快速进行无解判断的方法,比如和不能>n,且列之和等于行之和。
lvjaio5241 2009-07-13
  • 打赏
  • 举报
回复
学习一下
仗剑逗二哈 2009-07-13
  • 打赏
  • 举报
回复
头疼
jlp999 2009-07-13
  • 打赏
  • 举报
回复
我理解的题意:
这不就是Windows自带的小游戏“扫雷”的简单版本么
fjcqv 2009-07-12
  • 打赏
  • 举报
回复
好像是数字图像处理中的投影
zhongsuquan 2009-07-12
  • 打赏
  • 举报
回复
up
zhongsuquan 2009-07-11
  • 打赏
  • 举报
回复
up
ToBeTough 2009-07-10
  • 打赏
  • 举报
回复
up
fztjava 2009-07-10
  • 打赏
  • 举报
回复
1 0 0 1 1
0 0 1 1 0
0 0 1 0 0
0 1 0 0 0
1 0 1 1 0
----------
1 0 1 0 1
0 0 1 1 0
0 0 0 1 0
0 1 0 0 0
1 0 1 1 0
----------
1 0 1 1 0
0 0 0 1 1
0 0 1 0 0
0 1 0 0 0
1 0 1 1 0
----------
1 0 1 1 0
0 0 1 0 1
0 0 0 1 0
0 1 0 0 0
1 0 1 1 0
zhongsuquan 2009-07-10
  • 打赏
  • 举报
回复
顶起
zhongsuquan 2009-07-09
  • 打赏
  • 举报
回复
7楼的大哥说的非常对。我也留意到了这些问题,就是想不出好的方法来求解,特别是当矩阵较大的时候[Quote=引用 7 楼 matrixcl 的回复:]
这个题目有4组解,右上角那个3×3方阵的8个数字是可以变的。

1 0 0 1 1
0 0 1 1 0
0 0 1 0 0
0 1 0 0 0
1 0 1 1 0
----------
1 0 1 0 1
0 0 1 1 0
0 0 0 1 0
0 1 0 0 0
1 0 1 1 0
----------
1 0 1 1 0
0 0 0 1 1
0 0 1 0 0
0 1 0 0 0
1 0 1 1 0
----------
1 0 1 1 0
0 0 1 0 1
0 0 0 1 0
0 1 0 0 0
1 0 1 1 0

6楼的方法可行,但效率不高,如果5×5方阵这个边长扩大点,计算…
[/Quote]
zhongsuquan 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xxjjs 的回复:]
很简单啊,列N元一次方程啊

N*M矩阵,可以列N+M个方程,初中生就知道,如果未知数大约N+M,方程解不唯一
[/Quote]

兄弟能详细点吗?如何列?
加载更多回复(7)

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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