数据库UVA1592
这个题我感觉题目理解有点难度。他的主要意思就是假如有一列有几行相同,那么这相同的部分所在的行必定有其列也是相同的。
比如第二列的第二,三行是相同的。那么在第二,三行中必定有一个除第二列外相同的列。
分析:
这个其实可以用一个四重循环来做的。可能直接想不通,但是你用四种循环的话就很容易了,但这个四重循环肯定会超时。
可以用这种思路:枚举两列,然后用一个for循环一行一行的检查是不是有相同的。这样就是三重for循环。
检查相同时可以合并两列,这样减少比较的次数。
有一个陷阱:可能会有多对结果,只要输出一对就可以了。
package com.ahyer.bag;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static String[][] data = new String[10005][15];
public static Map<String, Integer> hashmap = new HashMap<>();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s = scanner.nextLine();
int rows = Integer.parseInt(s.split(" ")[0]);
int columns = Integer.parseInt(s.split(" ")[1]);
for (int i = 0; i < rows; i++) {
String str = scanner.nextLine();
String[] split = str.split(",");
data[i] = split;
}
boolean pnf = false;
for (int i = 0; i < columns; i++) {
for (int j = i + 1; j < columns; j++) {
hashmap.clear();
for (int k = 0; k < rows; k++) {
//合并两列
String text = data[k][i] + "," + data[k][j];
if (!pnf && hashmap.containsKey(text)) {
pnf = true;
System.out.println("NO");
System.out.format("%d %d
", hashmap.get(text) + 1, k + 1);
System.out.format("%d %d
", i + 1, j + 1);
} else {
hashmap.put(text, k);
}
}
}
}
if (!pnf) System.out.println("YES");
}
}
}