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