POJ 1753 POJ 2965 解题报告

 

POJ 1753 POJ 2965 解题报告

POJ 1753 POJ 2965 是同一类型的题目,但是2965 有一个比较简单的方法来解决。

 

POJ 1753 我用的是打表的方法,打表很不厚道。

思路:

首先我们需要确定存储的数据结构,从网上搜得用二进制位来存,这确实是个很巧妙的方法,例如,我们将问题简化为一个2X2 的矩阵,那么就只需要有4 个二进制位就可以存储,假如我们需要存储:

bw

wb

那么我们可以这样:

1 来表示b 0 来表示w ,则该二进制码表示为1001b ,转换为十进制为9 ,故可以int state = 9 ,这样就一个int 类型的变量就可以代表整个图了。

有了这个基础我们就可以说打表的方法了,首先先了解一下异或,异或用xor 表示,异或的结果是:相同取0 ,不同取1 。例:0101b xor 1000b = 1101b 。我们观察异或的结果:把上边的图转换为二进制码的结果是:1001b ,那么,如果我只想翻转位置为(1,1 )的棋子,那么我们可以state = state ^ 0001b (注: 二进制存储为从左到右,即如果是wb ,则二进制为10 )。接下来我们说打表的方法,我们知道,如果翻转(1,1) ,那么(1,2),(2,1) 也就随之翻转了,还是用这个2X2 的图为例说明,如果我们想进行上边提到的(1,1) 的翻转,那么我们可以将state 异或上0111b, 我们将类似0111b 这种数字存储到一个数组中,可以打表了。

网上说这是广度优先搜索(BFS ),但是我一直不明白这个哪里用到了广搜,百度百科上的广搜定义为:每次将集合中的元素经过一些改动,分层生成当前状态的子状态(通常还删除父情况),添加到集合(队列)中,以实现遍历或搜索等目的的算法。这种描述好像和我们数据结构课上的描述不太一样,这种想法也是正确的,因为首先是将翻转一个棋子的结果都入队了,而后又对应检查翻转第二次、第三次...

POJ 1753 AC 的代码:

 

POJ 2965

这个题目有一个比较简单的方法,我们可以想象一下,假如只想改变(1, 2) 的开关的状态,则这个时候需要将第1 行第2 列的所有开关都按下,此时,则第一行和第一列除了(1, 2) 外都改变了4 次,相当于没有改变,而(1, 2) 改变了7 次,相当于改变了1 次,剩下的改变了2 次,相当于没改变。

于是乎我们想到了一个方法,首先将所有位置都置为false

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值