我有点纠结于如何处理这个方阵编码项目。
每当我尝试输入任何值,结果总是为真,方阵是一个幻方。例如,这将是正确的:
16 03 02 13
05 10 11 08
09 06 07 12
04 15 14 01
但当我输入以下值时:
03 04 16 02
05 01 02 10
05 08 07 12
03 14 13 09
这应该返回false,但它仍然返回true,也就是说它是一个幻方。
要求是我需要所有的方法
“public void add(int i,int row,int col)”:在指定位置向矩阵添加一个整数。
公共
“Public boolean AllinRange”:确定矩阵中的所有值是否都在正确的范围内
“Public boolean AllUnique”:确定矩阵中的所有值是否只出现一次
“Public boolean ISMagic”:确定矩阵是否说明幻方。这意味着:
>
用户为某个数字输入了n^2个数字n
这些数字仅介于1和n^2之间(含1和n^2)
每个数字在矩阵中正好出现一次
每一行、每列和两条对角线中元素的和相等
公共类SquareMatrix{
private int[][] array;
public SquareMatrix(int size)
{
array = new int[size][size];
}
public void add(int i, int row, int column) {array[row][column] = i;}
//Just checks if the #of rows & columns are between 1-n^2
public boolean allInRange()
{
int n = array.length;
for (int row = 0; row < n; row++)
{
for (int col = 0; col < array[row].length; col++)
{
if (array[row][col] < 1 || array[row][col] > n*n)
return false;
}
}
return true;
}
public boolean allUnique()
{
for (int i =0; i < array.length - 1; i++)
{
for (int j = i + 1; j < array.length; j++)
{
if(array[i]==array[j])
return false;
}
}
return true;
}
//Supposed to call the other methods (allInRange & allUnique)
public boolean isMagic()
{
for(int[] row : array)
{
for (int num : row)
{
if (num == 0)
return false;
}
}
boolean range = allInRange();
if (range == true)
return true;
if (range == false)
return false;
boolean unique = allUnique();
if (unique == true)
return true;
if (unique == false)
return false;
int sumRow;
int sumCol;
int sum1 = 0;
int sum2 = 0;
//Sum of Left to Right Diaganol
for (int i = 0; i < array.length; i++)
{
sum1 += array[i][i];
}
//sum of right to left diaganol
for (int j = 0; j < array.length; j++)
{
sum2 += array[j][array.length-1-j];
}
if (sum1 != sum2)
return false;
//Sum of Rows
for (int row = 0; row < array.length; row++)
{
sumRow = 0;
for (int col = 0; col < array[row].length; col++)
sumRow += array[row][col];
if (sumRow != sum1)
return false;
}
//Sum of Col
for (int i = 0; i < array.length; i++)
{
sumCol = 0;
for (int j = 0; j < array.length; j++)
sumCol = array[j][i];
if (sumCol != sum1)
return false;
}
return true;
}
public String toString()
{
int n = array.length;
String lol = "";
for (int[] row : array)
{
for (int num : row)
{
String hi = String.format("%0"+(n*n+"").length()+"d",num);
lol += hi + " ";
}
lol += "\n";
}
return lol;
}
}
这是我的驱动程序类
import javax.swing.*;
public class SquareMatrixDriver {
public static void main(String[] args) { //My favorite line in history
JFrame bot = new JFrame(); //We can use JFrame to read the inputs
do
{
//We have to make sure that it is a valid input or else I am doomed
int size = 0;
do
{
size = Integer.parseInt(JOptionPane.showInputDialog(bot, "Enter the size of the matrix."));
if (size < 1)
{
JOptionPane.showMessageDialog(bot, "Invalid size! Enter a number greater than 0.");
}
}
while(size < 1);
SquareMatrix matrix = new SquareMatrix(size);
for (int i=0; i<size; i++)
{
//Gets thhe User's Input
String[] stringInput;
do
{
stringInput = JOptionPane.showInputDialog(bot, "Enter the row number" + (i + 1) + ", with " + size + " elements, split by commas.").split(",");
if (stringInput.length != size)
{ //In this code we basically enter the numbers with commas
JOptionPane.showMessageDialog(bot, "Invalid size! " + stringInput.length + " elements entered but " + size + " required.");
}
}
while(stringInput.length != size);
int[] intInput = new int[size];
for (int o=0; o<size; o++)
{
}
for (int o=0; o<size; o++)
{
matrix.add(Integer.parseInt(stringInput[o]), i, o); //Here we would put everything into the Matrix
}
}
JOptionPane.showMessageDialog(bot, "The matrix is " + (matrix.isMagic()? "very" : "not") + " correct"); //This line will output if the Matrix works or doesnt work
JOptionPane.showMessageDialog(bot, matrix); // Enters out the final output
} while (JOptionPane.showConfirmDialog(bot, "Do you wish to exit?", "Exit", JOptionPane.YES_NO_OPTION) == 1); //Asks the User if they would like to exit the program
}
}
我可以通过目测发现的错误:
allUnique()是完全错误的,您必须检查每个数字在矩阵中是否只出现一次,但您比较的是完全不同的行数组,检查唯一性的最佳方法通常是使用哈希集,但由于这里有一个非常定义的数字范围(从1到n2),所以使用n2布尔数组。扫描方阵并测试/设置数组中的相应元素,如果已经设置,则返回false。
public boolean allUnique() {
int n=array.length;
boolean[] set=new boolean[n*n];
for (int i=0; i < n; i++) {
for (int j=0;j < n; j++) {
//Here assuming that you already sucessfully called allInRange,
//otherwise we must check bounds to avoid an index out of bounds exception
if(set[array[i][j]-1]) {
return false;
}
set[array[i][j]-1] = true;
}
}
return true;
}
在方法isMagic()中,所有这部分都是错误的和多余的
boolean range = allInRange();
if (range == true)
return true; //WRONG, this will immediately return with true, without further checks
if (range == false)
return false;
boolean unique = allUnique();
if (unique == true)
return true; //WRONG, same as before
if (unique == false)
return false;
只需将其替换为
if (!allInRange()) {
return false;
}
if (!allUnique()) {
return false;
}
最后,在isMagic()中,当计算列的和时,缺少加法
sumCol = array[j][i];
必须替换为
sumCol += array[j][i];
英威腾: 前天晚上24点投的简历 第二天早上十点电话来了加微信 下午2电话人事面 4点专业面 6点oc 待遇也还行,对我这学历很友好了 主要是工作内容是我喜欢的,我也打算签了 辛辛苦苦秋招忙了近俩月,不如一晚上来的痛快 哈哈哈哈 专业面: 1、唠家常 2、英语自我介绍及简单英语对话 3、介绍项目并围绕项目提问知识点(超基础) 4、围绕岗位聊了一堆 风评也不卷,太走运了😙😙😙
面的后台开发,又被写go的捞了,腾讯的后台开发是全面转go了吗,不晓得了 20分钟就结束了,以为是kpi面,竟然过了。 经典八股 进程线程协程区别 tls握手 谈谈http2.0 面试官是懂cpp的,但没问cpp就离谱
紫色透露着诡异的气息,所以能制造奇幻的效果。各种彩度与亮度的紫色,配上橘色和绿色,便是刺激与新奇的最佳代言人。如果紫色配上黄绿色或黄橘色,色调不合、怪异,而且俗不可耐,但如果配上它真正的补色——黄色,便能展现怪诞、诡异的感觉,令人不禁要驻足,欣赏一番。 以现代流行语来说,紫色象征“青涩”或“未成年”,常被用以代表两代关系之间的沟通桥梁。 补色色彩组合 二次色色彩组合 单色色彩组合 40 87 36
问题内容: 我必须编写一个程序,该程序需要用户输入一个奇数并创建一个幻方。幻方是指行,列和对角线的总和相同的正方形。这些是编写代码的特征: 向用户询问一个奇数 创建一个n x n数组。 请按照以下步骤创建一个魔术方块。 一个。在第一行的中间放置一个1。 b。从行中减去1,然后在列中加1。 一世。如果可能,将下一个数字放在该位置。 ii。如果不可能,请按照下列步骤操作。 如果在第-1行,则更改为最后
如何使用类的对象调用函数?
在我的代码中,它显示消息100的警告是一个神奇的数字。请参阅以下代码, 我在这里读到了什么是神奇的数字,为什么它不好?但我怀疑通过创建静态变量来声明100会占用更多空间,因为我在一个地方使用它。这是解决这个问题的正确方法吗? 有什么建议吗?