矩阵翻硬币Java编程问题标题:矩阵翻硬币小明先把硬币摆成了一个 n 行 m 列的矩阵.随后,小明对每一个硬币分别进行一次 Q 操作.对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/30 03:11:55
矩阵翻硬币Java编程问题标题:矩阵翻硬币小明先把硬币摆成了一个 n 行 m 列的矩阵.随后,小明对每一个硬币分别进行一次 Q 操作.对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y

矩阵翻硬币Java编程问题标题:矩阵翻硬币小明先把硬币摆成了一个 n 行 m 列的矩阵.随后,小明对每一个硬币分别进行一次 Q 操作.对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y
矩阵翻硬币Java编程问题
标题:矩阵翻硬币
小明先把硬币摆成了一个 n 行 m 列的矩阵.
随后,小明对每一个硬币分别进行一次 Q 操作.
对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转.
其中i和j为任意使操作可行的正整数,行号和列号都是从1开始.
当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上.
小明想知道最开始有多少枚硬币是反面朝上的.于是,他向他的好朋友小M寻求帮助.
聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态.然而小明很懒,不愿意照做.于是小明希望你给出他更好的方法.帮他计算出答案.
这个Q操作的定义是什么意思?将所有第 i*x 行,第 j*y 列的硬币进行翻转,怎么翻转啊?翻转哪些啊?

矩阵翻硬币Java编程问题标题:矩阵翻硬币小明先把硬币摆成了一个 n 行 m 列的矩阵.随后,小明对每一个硬币分别进行一次 Q 操作.对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y
package zhidao;

import java.util.Arrays;

/**
 * 标题:矩阵翻硬币<br>
 * 
 * @author Yugi111
 */
public class Q
{
\x09// 假设0表示反面
\x09// 小明先把硬币摆成了一个 n 行 m 列的矩阵.
\x09int[][] qArray = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };

\x09/**
\x09 * 随后,小明对“每一个”硬币分别进行 "一次" Q 操作.<br>
\x09 * 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转.
\x09 */
\x09private void qTurn ()
\x09{
\x09\x09// 其中i和j为任意使操作可行的正整数 > 0,行号和列号都是从1开始.
\x09\x09for ( int x = 1; x < qArray.length; x++ )
\x09\x09{
\x09\x09\x09for ( int y = 1; y < qArray[x].length; y++ )
\x09\x09\x09{
\x09\x09\x09\x09for ( int i = 1; i < qArray.length / x; i++ )
\x09\x09\x09\x09{
\x09\x09\x09\x09\x09for ( int j = 1; j < qArray[x].length / y; j++ )
\x09\x09\x09\x09\x09{
\x09\x09\x09\x09\x09\x09// 对“每一个”硬币分别进行 "一次" Q 操作
\x09\x09\x09\x09\x09\x09qArray[i * x][j * y] = qArray[i * x][j * y] == 0 ? 1 : 0;
\x09\x09\x09\x09\x09}
\x09\x09\x09\x09}
\x09\x09\x09}
\x09\x09}
\x09}

\x09public static void main ( String[] args )
\x09{
\x09\x09Q q = new Q ();
\x09\x09q.qTurn ();
\x09\x09for ( int i = 0; i < q.qArray.length; i++ )
\x09\x09{
\x09\x09\x09System.out.println (Arrays.toString (q.qArray[i]));
\x09\x09}
\x09\x09System.out.println (" 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上.");
\x09\x09System.out.println (" 小明想知道最开始有多少枚硬币是反面朝上的." + "于是,他向他的好朋友小M寻求帮助.\n    " + "聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,"
\x09\x09\x09\x09+ "即可恢复到最开始的状态.然而小明很懒,不愿意照做." + "于是小明希望你给出他更好的方法.帮他计算出答案");
\x09\x09System.out.println ("\n由于0表示反面,1表示正面. \n 所以: \n");
\x09\x09int count = 0;
\x09\x09for ( int i = 0; i < q.qArray.length; i++ )
\x09\x09{
\x09\x09\x09for ( int j = 0; j < q.qArray[i].length; j++ )
\x09\x09\x09{
\x09\x09\x09\x09if (q.qArray[i][j] == 1)
\x09\x09\x09\x09{
\x09\x09\x09\x09\x09count++;
\x09\x09\x09\x09}
\x09\x09\x09}
\x09\x09}
\x09\x09System.out.println ("最开始有 " + count + " 枚硬币是反面朝上的");
\x09}
}