当前位置: 首页 > 知识库问答 >
问题:

创造一个神奇的广场(Java)

江同化
2023-03-14

我有点纠结于如何处理这个方阵编码项目。

每当我尝试输入任何值,结果总是为真,方阵是一个幻方。例如,这将是正确的:

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
      }
    }
    
    
    
    
    
    
          
          
         
    
  • 共有1个答案

    国阳
    2023-03-14

    我可以通过目测发现的错误:

    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会占用更多空间,因为我在一个地方使用它。这是解决这个问题的正确方法吗? 有什么建议吗?