数据库UVA1592

数据库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");
        }
    }
}

原文地址:https://www.cnblogs.com/HyPhoenix/p/14406258.html