楼主: newkid

[每日一题] PUZZLEUP 2015

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
141#
 楼主| 发表于 2015-9-4 04:15 | 只看该作者
〇〇 发表于 2015-9-3 06:31
1*1 2*2 3*3分别几次

规律就是每个步骤都选中标准棋盘中那个黑色的方格。
3X3没有答案。
按此规律8X8应该是32步。但要怎么证明呢?

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
142#
发表于 2015-9-4 06:48 | 只看该作者
newkid 发表于 2015-9-4 04:14
不知道,有证明估计也看不懂。
棋盘那个能证明吗?

说的就是棋盘那个阿,那个解太平凡了阿

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
143#
发表于 2015-9-4 07:18 | 只看该作者
估计SQL也做不出来,我贴答案了

这次的代码有点长,但最后一句证明了只有一个解,求解SAT,我完全不了解SAT是怎么算的,但是不影响我用这个工具

In[10]:= B = 8;
X = Table[x[i, j], {i, B}, {j, B}];
target1 = Table[Mod[i + j, 2] == 1, {i, B}, {j, B}];
target1 = Table[Mod[i + j, 2] == 0, {i, B}, {j, B}];
chesses = Table[If[m == i || n == j, True, False], {i, B}, {j, B}, {m, B}, {n, B}];
CHESSES = Table[X[[Quotient[i, B] + 1, Mod[i, B] + 1]]
    && (chesses[[m, n]][[Quotient[i, B] + 1, Mod[i, B] + 1]]),
   {m, B}, {n, B}, {i, 0, B*B - 1}];
EQUATION = Apply[And, MapThread[Xor, {Flatten@target1, Flatten@Apply[Xor, CHESSES, {2}]}]];
SOL = Count[(X /. FindInstance[EQUATION, Flatten@X]), True, 3]
SatisfiabilityCount[EQUATION, Flatten@X]

Out[17]= 32

Out[18]= 1

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
144#
发表于 2015-9-4 07:21 | 只看该作者
基本原理如下:

In[20]:= FindInstance[a || b || c, {a, b, c}]
SatisfiabilityCount[a || b || c, {a, b, c}]

Out[20]= {{a -> True, b -> True, c -> True}}

Out[21]= 7

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
145#
发表于 2015-9-4 07:31 | 只看该作者
暴力求解只能到4

In[1]:= board = Table[0, {4}, {4}];
target1 = Table[Mod[i + j, 2], {i, 4}, {j, 4}];
target2 = Table[Mod[i + j + 1, 2], {i, 4}, {j, 4}];
chesses = Table[If[m == i || n == j, 1, 0], {i, 4}, {j, 4}, {m, 4}, {n, 4}];
digits[n_] := Flatten@Position[Reverse@IntegerDigits[n, 2], 1] - 1;
chess[n_] := Map[chesses[[Quotient[#, 4] + 1, Mod[#, 4] + 1]] &, digits[n]];
solution[k_] := Fold[MapThread[BitXor[#1, #2] &, {#1, #2}, 2] &, board, chess[k]];
display[n_] := Table[If[BitAnd[n, 2^(i*4 + j)] == 0, 0, 1], {i, 0, 3}, {j, 0, 3}];
display /@ Select[Range[2^16 - 1], ((# == target1 || # == target2) &)[solution[#]] &]

Out[9]= {{{0, 1, 0, 1}, {1, 0, 1, 0}, {0, 1, 0, 1}, {1, 0, 1, 0}}, {{1, 0, 1, 0}, {0, 1, 0, 1}, {1, 0, 1, 0}, {0, 1, 0, 1}}}

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
146#
 楼主| 发表于 2015-9-4 09:29 | 只看该作者
lugionline 发表于 2015-9-4 06:48
说的就是棋盘那个阿,那个解太平凡了阿

是很平凡但是你能证明吗?
140那个图是上一题的吧,怎么全是直线,难道曲线的限制是可以去除的?

你的代码太高大了,SAT是啥?就是SatisfiabilityCount?
除了最后那个1有具体的输出吗?
现在我用SQL能解6X6, 花了17秒,8X8的还要再优化。

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
147#
发表于 2015-9-4 09:55 | 只看该作者
本帖最后由 lugionline 于 2015-9-4 10:03 编辑

曲线应当是不必要的

自然可以输出好看点的格式,那就要贴图片



我就是构造64个 布尔代数方程,然后把这些方程and起来去求解,不过我的True/False好像反了因为要XOR原始的False值,但是对结果没影响,算8*8大概10秒这样

里面构造CHESSES的方法有点笨,应当一遍就能算好的,矩阵操作还不是很懂

SatisfiabilityCount 可以算出这个方程有多少个解,这个返回1,那就是用程序方式证明了只有一个解

https://en.wikipedia.org/wiki/Boolean_satisfiability_problem


使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
148#
 楼主| 发表于 2015-9-4 10:13 | 只看该作者
优化后的SQL能跑出来了,8X8花了十分钟!i7 16g 的笔记本。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
149#
发表于 2015-9-4 12:21 | 只看该作者
newkid 发表于 2015-8-27 04:39
改题目了:
The 10 points themselves will not be considered as intersection points.
这十个点本身不算 ...

这个题关键是要想清楚算法,然后用什么语言去计算就都不会是难事
不过这算法好难想出来

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
150#
发表于 2015-9-4 12:22 | 只看该作者
lugionline 发表于 2015-9-3 12:34
怎么证明是最少的呢?

图片答案:

线可以不是直的,所以你这些图在点多的时候都不会是最佳方案

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表