与矩阵,n * n网格等相关的C ++代码

时间:2010-01-28 06:35:03

标签: c++ matrix button

斐伊川, 问题陈述是:

按钮

N x N网格的每个单元格是0或1.您将获得两个这样的N x N网格,即初始网格和最终网格。每个行和初始N x N网格的每列都有一个按钮。按行按钮可切换该行中所有单元格的值,按下列按钮可切换该列中所有单元格的值。您需要找到将网格从初始配置转换为最终配置所需的最小按钮数,以及必须按下以进行此转换的按钮。 编辑:当初始配置和最终配置相同时,打印“0”。 输入
第一行包含t,测试用例数(约10)。然后是t测试案例。

每个测试用例具有以下形式: *第一行包含n,电路板的尺寸(1≤n≤1000)。 * n行跟随。第i行包含n个空格分隔的整数,表示初始网格的第i行。每个整数都是0或1。 * n行跟随,表示最终网格,格式与上述相同。 产量 对于每个测试用例,输出按下行按钮的次数,然后输出必须按下的行按钮。接下来打印列按钮按下次数,然后按下必须按下的列按钮的0索引索引。必须最小化按钮的总数。 如果无法从初始配置实现最终配置,则输出“-1”。如果有多个解决方案,请打印其中任何一个。 例 输入: 1 3 0 0 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1

输出: 1 0 1 2

我已将代码上传到:http://www.megaupload.com/?d=VOJR39BM

虽然它在我的机器上运行得非常好,但它不接受codechef的解决方案并给我一个错误的答案。任何人都可以指导我该怎么做pls pls pls ??

代码用C ++编写,用g ++编译器编译。

任何帮助都会深深感激ppl :) 提前感谢

1 个答案:

答案 0 :(得分:0)

在发布的代码中,我会在您计算“matrixc”后修改代码。我发现很难超越这一点,所以我将停止查看代码并讨论问题。对于那些没有代码的人,矩阵C =初始矩阵 - 最终矩阵。矩阵在二进制字段上。

在这些问题中,请查看解决方案中的对称性。有三种对称性。一个是按钮的顺序无关紧要。如果您采用有效的解决方案并重新安排它,您将获得另一个有效的解决方案。另一种对称性是按下按钮两次与完全按下按钮相同。最后的对称性是,如果你采用有效解的补充,你会得到另一个有效的解决方案。例如,在3x3网格中,如果S = {row1,row3,col1}是一个解,那么S'= {row2,col2,col3}也是一个解决方案。

所以你需要做的就是找到一个解决方案,然后利用对称性。因为你只需要找到一个,就做你能想到的最简单的事情。我只想看第1列和第1行来构建解决方案,然后针对整个矩阵检查解决方案。如果这个解决方案为NxN网格提供了超过N个按钮,那么请使用解决方案的补充,最后会得到一个较小的。

对称性是计算机科学中一个非常重要的概念,几乎无处不在。理解这个问题的对称性是允许您在不检查每个可能的解决方案的情况下解决它的原因。

P.S。你说这段代码是C ++,但如果从顶部删除#include <iostream>,它也是完全有效的。如果将其编译为C,则编译可能需要更少的时间。