【问题标题】:Algorithm not showing right output算法没有显示正确的输出
【发布时间】:2018-04-27 21:22:45
【问题描述】:

问题是:

给定一个大小为 n × n 的二元矩阵(即矩阵的每个元素为 0 或 1)。您想重新排列 1,使它们形成一个矩形区域。注意矩形区域应该只由1组成,整个矩阵的所有1都应该在这个矩形区域内。

为了实现矩形区域,可以交换任意两个矩阵元素。请找出所需的最少交换次数。如果无法以所需的方式重新排列 1,请打印 -1。

输入

输入的第一行包含一个整数 T,表示测试用例的数量。 T 测试用例的描述如下。 每个测试用例的第一行将包含一个整数 n 表示矩阵的维度。 接下来的 n 行中的每一行将包含 n 个空格分隔的整数,表示矩阵的第 i 行。

输出

对于每个测试用例,打印一行,其中包含一个整数,表示所需的最小交换次数或 -1,具体取决于具体情况。

示例

输入:

2

2

0 1

1 0

2

1 1 

1 0

输出:

1 

-1

说明

示例情况 1。您可以将第二行第一列的 1 与第一行第一列的 0 交换。 交换后,矩阵如下所示。

1 1 
0 0

这里所有的 1 组成一个 1 × 2 的矩形区域。在这种情况下,需要进行 1 次交换。

请注意,您也可以将第一行第二列的 1 与第二行第二列的 0 交换。 此交换后的矩阵将跟随。

0 0
1 1 

所以在这种情况下你也需要 1 次交换。

所以总的来说,你需要 1 次交换。

示例案例 2。无法在 2 × 2 维度的矩阵中创建包含 3 个 1 的矩形区域,因此答案为 -1。

我的算法[编辑]

  1. 首先我从用户那里获取案例数量
  2. 那么矩阵的顺序[将是 nxn 顺序]。
  3. 所以逻辑是,如果矩阵是 1x1,那么它将简单地打印 0
  4. 否则,在从用户那里获取输入时 [只有 1 或 0] 我会计算 1,因为我开发的逻辑是,当在奇数顺序的矩阵中,1 将是偶数,那么它不能以矩形形式排列。并且对于偶数矩阵,如果 1 是奇数,则不能排列。
  5. 接下来我将遍历每个索引,如果我找到一个,然后我移动到下一个元素,否则我尝试在同一列中找到 1,如果没有找到比我打破循环显示 -1 不能以矩形形式排列
  6. 在安排一行后,我检查下一行是否已经安排好,然后我打破所有内容并移至下一个案例

n个长方形

我的解决方案

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

    static long startTime;

    public static void main(String[] args) {


Scanner scanner = new Scanner(System.in);
            int numberOfOnes = 0;
            int T = scanner.nextInt();

            for (int t = 1; t <= T; t++) {
                int n = scanner.nextInt();

                int loopCounter, swapCounter = 0;
                boolean rowContainsZero = false;
                int array[][] = new int[n][n];
                boolean reject = true;
                //Worst and the most simpler conditions
                if (n == 1) {
                    System.out.print("0");
                    exitingSystem();
                }
                for (int i = 0; i < n; i++) {
                    for (int j = 0; j < n; j++) {
                        array[i][j] = scanner.nextInt();
                        if (array[i][j] == 1) {
                            numberOfOnes++;
                        }
                    }
                }
                if (n % 2 == 0 && numberOfOnes % 2 != 0) {
                    System.out.println("-1");
                    if (t == T) {
                        exitingSystem();
                    }
                    continue;

                } else if (n % 2 != 0 && numberOfOnes % 2 == 0) {
                    System.out.println("-1");
                    if (t == T) {
                        exitingSystem();
                    }
                    continue;
                }
                //     System.out.println("Here i am");
                //From here swaping processes will take the place
                for (int i = 0; i < n; i++) {
                    for (int j = 0; j < n; j++) {
                        if (array[i][j] == 1) {
                            continue;
                        } else if (array[i][j] == 0) {
                            loopCounter = i;
                            reject = true;
                            while (loopCounter < n) {
                                if (array[loopCounter][j] == 1) {
                                    int temp = array[loopCounter][j];
                                    array[loopCounter][j] = array[i][j];
                                    array[i][j] = temp;
                                    reject = false;
                                    swapCounter += 1;
                                    break;
                                }
                                loopCounter++;
                            }
                             if (rowContainsZero) {
                                System.out.println("" + swapCounter);
                                    break;
                            }
                            if (reject == true) {
                                System.out.println("-1");
                                break;
                            } else {
                                for (int m = i + 1; m < n; m++) {
                                    for (int k = 0; k < n; k++) {
                                        if (array[m][k] == 0) {
                                            rowContainsZero = true;
                                        } else {
                                            rowContainsZero = false;
                                            break;
                                        }
                                    }
                                }
                            }

                        } else {
                            System.out.println("0's and 1's were Expected :(");
                            exitingSystem();
                        }
                    }
                    if (reject == true) {
                        break;
                    }
                }
            }

    }

    public static void exitingSystem() {
        System.exit(0);
    }

}

但是 CODECHEF 计算机回答错误 + 他们也允许从键盘输入输入

【问题讨论】:

  • 请解释你的算法。首先,当人们试图向别人解释他们的推理时,他们经常会发现自己的错误。其次,它使我们更容易发现问题。逆向工程这么长的方法并不容易。
  • 我应该在编辑中解释还是在评论中解释?
  • 更好地编辑您的问题。
  • 我试图解释一切并编辑
  • 感谢您的解释。这很有帮助。

标签: java algorithm matrix multidimensional-array 2d


【解决方案1】:

这不是您尝试解决问题的方式。假设你有

                                                                 0 0 1
                                                                 0 1 1
                                                                 0 0 1            

这是可解矩阵的完美示例,但您不能简单地使用随机交换然后获取结果。您需要使用带有曼哈顿距离的A* 搜索算法。

  • 创建一个优先队列
  • 定义曼哈顿距离。

  • 创建一个函数来创建每个板的后继者。就像如果我有光明磊落,那么它会给你一堆板子回来:

    0 0 1 0 1 1 ==> colection 0 0 1

    0 1 1 0 0 1 0 0 1

    0 0 1 0 0 1 0 1 1

    0 1 0 0 1 1 0 0 1

    0 0 1 0 1 1 0 1 0

  • A 的描述:*

  • 存储访问过的公猪的初始 lis,这样您就不会再次访问它们。

  • i will call MinPriority queue a pq
  • `在pq中插入initial_board
  • while(!pq.isEmpty() && !foundGoal(pq.min)) //当你找到目标时 曼哈顿距离为 0。
  • 板 = pq.delMin(); //你必须覆盖距离方法 优先队列,因此它将返回您的曼哈顿董事会 距离最小。
  • for(boards b :board.getSuccesors(); // 给你看板集合。
  • if(notvisited(b,vistiedList)) // 这样你就不会再次进入相同的状态并且 再次。

  • pq.insert(b); 访问列表.add(b);`

在第一年,我必须解决 8 谜题,您可以通过这种方式解决,但是您也可以使用汉明距离,但这效率不高,这里是 is 8-puzzle 代码(使用 A* 实现)。

【讨论】:

    【解决方案2】:

    我认为你的算法并不完全正确。

    我认为以下是您的第 4 步/奇数顺序 (n=3) 和偶数 (numberOfOnes=4) 的反例:

    1 1 0
    1 1 0
    0 0 0
    

    这应该是 0。 n=4 和 numberOfOnes=3 类似:

    1 1 1 0
    0 0 0 0
    0 0 0 0
    0 0 0 0
    

    这也应该给出 0。

    我还没有深入分析你的第 5 步和第 6 步。

    这里有更多例子:

    1 1 1 0
    1 1 0 0
    1 1 1 0
    1 1 0 0
    

    这应该给出 -1,因为从 10 个中你只能形成 2*5 或 1*10 形式的矩形,它们都不适合 4*4 框架。

    1 1 1 0
    1 1 0 0
    1 1 1 0
    1 0 0 0
    

    这应该给出 1,因为通过将左下角的 1 上下移动两点,你会得到一个 3*3 的矩形。

    【讨论】:

    • 如果这通过了,那么在接下来的步骤中,我评论如下 //From here 交换进程将代替处理这一切,并且如果这可以形成 ractangle,我会找到 ut
    • 对不起,我主要看算法解释,对你的代码没有太多了解。我将编辑我的答案。
    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2021-05-19
    相关资源
    最近更新 更多