楼主: newkid

[精华] ITPUB第3届“盛拓传媒杯”SQL数据库编程大赛第2题及附加题参考解题思路

[复制链接]
论坛徽章:
289
蛋疼蛋
日期:2013-03-29 13:46:58优秀写手
日期:2013-12-24 06:00:12福特
日期:2014-02-17 17:30:59生肖徽章:兔
日期:2012-05-24 19:03:36SQL极客
日期:2013-12-09 14:13:35ITPUB季度 技术新星
日期:2014-02-24 11:00:06IT宝贝
日期:2014-08-27 10:32:17马上加薪
日期:2014-08-05 09:18:33SQL数据库编程大师
日期:2016-01-13 10:30:43玉石琵琶
日期:2014-03-04 16:46:07
11#
发表于 2015-12-21 10:23 | 只看该作者
想像一下,有个军师把N种后续棋局的答案都搞到手了,于是N个空位都被标上了获胜者以及步数。那么为了回答第二题,只需按如下顺序查看这N种后续棋局:
A.如果存在当前棋手能获胜的棋局,那么最终胜者为当前棋手,步数则是各种获胜走法中最少的步数加一。因为当前棋手有主动权选择对他最有利的走法。
B.如果不存在当前棋手必胜的棋局,但存在和棋,那么最终答案为和棋。
C.如果N种结局都是对手取胜,那么答案是对手胜,步数则取最大的获胜步数。因为当前棋手会选择支撑最久的走法,而步数只算胜者的,不用加一。


不明白,第一条不用考虑对方起手走错才能获胜吗

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
12#
发表于 2015-12-21 10:54 | 只看该作者
demonat 发表于 2015-12-21 10:23
不明白,第一条不用考虑对方起手走错才能获胜吗

必胜要尽快取胜,明知必输要拖延到底

使用道具 举报

回复
论坛徽章:
169
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
13#
发表于 2015-12-21 12:44 | 只看该作者
第二题结果完全正确的有多少?

使用道具 举报

回复
论坛徽章:
169
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
14#
发表于 2015-12-21 12:47 | 只看该作者
BITAND(t.o+cells.b,win.win_bits)=win.win_bits

这里不太懂,大叔能不能仔细讲一下如何用二进制来解决的。

使用道具 举报

回复
论坛徽章:
8286
菠菜神灯
日期:2016-10-27 15:43:20菠菜神灯
日期:2016-10-27 16:05:30菠菜神灯
日期:2016-10-27 16:05:30菠菜神灯
日期:2015-07-24 14:56:20菠菜神灯
日期:2016-10-27 16:05:30菠菜神灯
日期:2015-04-17 18:02:23菠菜神灯
日期:2015-04-17 18:02:23菠菜神灯
日期:2016-10-27 16:05:30菠菜神灯
日期:2016-10-27 16:05:30菠菜神灯
日期:2016-10-27 16:05:30
15#
发表于 2015-12-21 13:25 | 只看该作者
膜拜大神
赞 !

使用道具 举报

回复
论坛徽章:
12
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL大赛参与纪念
日期:2016-01-13 10:32:19秀才
日期:2016-01-06 14:01:09秀才
日期:2016-01-06 14:06:43秀才
日期:2016-01-06 14:07:02ITPUB社区OCM联盟徽章
日期:2015-04-01 11:16:20举人
日期:2016-01-22 18:01:09秀才
日期:2016-01-22 17:58:00秀才
日期:2016-01-22 17:58:00秀才
日期:2016-01-22 17:58:00
16#
发表于 2015-12-21 14:33 | 只看该作者
如果存在当前棋手能获胜的棋局,那么最终胜者为当前棋手,步数则是各种获胜走法中最少的步数加一。因为当前棋手有主动权选择对他最有利的走法。

这句话的依据是什么?

使用道具 举报

回复
论坛徽章:
12
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL大赛参与纪念
日期:2016-01-13 10:32:19秀才
日期:2016-01-06 14:01:09秀才
日期:2016-01-06 14:06:43秀才
日期:2016-01-06 14:07:02ITPUB社区OCM联盟徽章
日期:2015-04-01 11:16:20举人
日期:2016-01-22 18:01:09秀才
日期:2016-01-22 17:58:00秀才
日期:2016-01-22 17:58:00秀才
日期:2016-01-22 17:58:00
17#
发表于 2015-12-21 14:54 | 只看该作者
能不能用一种更直白的思路呢?
试着往每一处可落子的位置落子,根据一定的游戏规则来给这一处的落子一个分值,来代表这一处落子的一个权重,然后每一步都用rank出来权重最高的继续循环下去?

使用道具 举报

回复
论坛徽章:
12
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL大赛参与纪念
日期:2016-01-13 10:32:19秀才
日期:2016-01-06 14:01:09秀才
日期:2016-01-06 14:06:43秀才
日期:2016-01-06 14:07:02ITPUB社区OCM联盟徽章
日期:2015-04-01 11:16:20举人
日期:2016-01-22 18:01:09秀才
日期:2016-01-22 17:58:00秀才
日期:2016-01-22 17:58:00秀才
日期:2016-01-22 17:58:00
18#
发表于 2015-12-21 15:02 | 只看该作者
本帖最后由 uc_jmh 于 2015-12-21 15:06 编辑

还是拿你的443来举例


从图上可以看到,除了你说的第一子落在第二排第二个(也就是6)之外 还可以落在 7  11  10 这都可以
总共要落5个子 也就是你说的x3。。。。
p.s.:在另一个贴我们讨论出来的我的输出是x4是因为有个bug....我擦
当然我现在的也可能有大量bug 我只是讨论一下另一种思路


使用道具 举报

回复
论坛徽章:
12
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL大赛参与纪念
日期:2016-01-13 10:32:19秀才
日期:2016-01-06 14:01:09秀才
日期:2016-01-06 14:06:43秀才
日期:2016-01-06 14:07:02ITPUB社区OCM联盟徽章
日期:2015-04-01 11:16:20举人
日期:2016-01-22 18:01:09秀才
日期:2016-01-22 17:58:00秀才
日期:2016-01-22 17:58:00秀才
日期:2016-01-22 17:58:00
19#
发表于 2015-12-21 15:20 | 只看该作者
简单说一下思路:
我们当7 8 5来看问题
当落一个字的时候要判断:
1.自己是否自己能赢  如果自己能赢的话 游戏结束 (攻)                                          
2.是否能马上阻挡别人能赢 如果是 则放在这里 (防)
3.自己是否能造成活4  即当前点处于四子之中 并且这四个子的两边都能组成5个子   (攻)
4.自己是否能造成死4  即当前点处于四子之中 并且这四个子的一边都能组成5个子,另一边可是尽头 ,也可以是别人的子  (攻)
5.别人是否能活4  (攻)
6.别人是否能死4  (攻)
7.自己是否能造成活3  (攻)
8.自己是否能造成死3   (攻)
9.别人是否能活3  (防)
10.别人是否能死3(防)
11.自己活2   (攻)
12:自己死2   (攻)
13.别人活2(防)
14:别人死2(防)
15;自己活1(攻)
16:自己死1(攻)
17:别人活1(防)
18:别人死1(防)

简单按照以上规则  复杂来说不考虑  并不预测出更多的步数用代码来实现的话:
----------------------------------------
1.自己是否自己能赢  如果自己能赢的话 游戏结束 (攻)
判断当前落子的位置向上下左右以及四个斜边 包含自己在内的是否有连续的5个子
2.是否能马上阻挡别人能赢 如果是 则放在这里 (防)
判断当前落子的位置向上下左右以及四个斜边 是否有别人连续的四个子
3.自己是否能造成活4  即当前点处于四子之中 并且这四个子的两边都能组成5个子   (攻)
判断当前落子的位置向上下左右以及四个斜边 包含自己在内的是否有连续的4个子 并且顺延下去的两个方向上都不是别人的子或者已经到了尽头
4.自己是否能造成死4  即当前点处于四子之中 并且这四个子的一边都能组成5个子,另一外可是尽头 ,也可以是别人的子  (攻)
判断当前落子的位置向上下左右以及四个斜边 包含自己在内的是否有连续的4个子 并且顺延下去的两个方向上有一个方向不是别人的子或者已经到了尽头

----------------------------------以上为落子的算法 未完成的有
1.当不能勾成K个字的时候 不去考虑那么多 直接为小
2.当都能勾成多个的时候  要根据是否有别人的在这条边上 取最优
3.当都能勾成多个的时候  根据哪个勾成的多个几活  取最优
4.当都不能赢的时候  不用随机再下子  直接报活棋  
如果我们以443或者n=m=k或者k和nm的值相差的并不大的时候来看的话  这几个可以先忽略。最起码这样不用生成游戏树这么庞大的东西、

使用道具 举报

回复
论坛徽章:
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
20#
 楼主| 发表于 2015-12-21 22:38 | 只看该作者
demonat 发表于 2015-12-21 10:23
不明白,第一条不用考虑对方起手走错才能获胜吗

对手不会出错。
你要考虑的是这N种选择中,有没有必胜的。侥幸获胜(哪怕步数很少)也不能选,因为你下完主动权就轮到对方了。
如果有多种必胜的,则考虑步数少的。
就这么简单。

使用道具 举报

回复

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

本版积分规则 发表回复

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