Skip to content

7-12 人工智能刑警

ai.png

人工智能技术在刑侦领域已经有了长足的发展,可以在拥挤的人群中识别出每个人的面部特征,与数据库中所有罪犯的面部特征进行匹配,自动识别出其中的罪犯。

本题就请你实现一个简单的自动识别程序,根据系统抽取出的若干面部特征判断其是否罪犯。

输入格式:

输入第一行给出两个正整数 N(≤2×104)和 M(≤10),分别为数据库中罪犯的数量和每个人脸提取的不同特征的数量。随后 N 行,每行给出 M 个整数,以空格分隔。第 i 行给出的是第 i 号罪犯的面部特征(1≤iN),格式为:

特征1 特征2 …… 特征M ID
特征1 特征2 …… 特征M ID

其中每个特征是一个 [1,109] 区间内的整数;ID 是罪犯的编号,为不超过 20 位的正整数。注意不同位置的特征对应不同种类,例如特征1对应眼距、特征2对应唇宽等等。题目保证不存在任何两个罪犯具有完全相同的面部特征,所有 ID 也都是不同的。

再下面给出一系列捕捉到的人脸的面部特征。当特征10 时标志输入结束,这一行输入不要处理。此外,为了帮助你区分罪犯和普通人的数据,这两部分数据之间有一个空行。(因为是简单题,所以查询数据量比较小,不超过 2000。当然你可以考虑一下,如果查询数量巨大应该怎么处理……)

输出格式:

对每个捕捉到的人脸,如果与某个罪犯完全匹配,则在一行中输出罪犯编号(注意:如果有前导零也必须原样输出);如果没有匹配任何罪犯,则输出 Pass

输入样例:

tex
9 4
15 23 23 7 0001
12 32 15 5 2001
10 15 23 3 3725
12 17 15 6 0238
15 10 23 11 99674
29 32 33 4 00253
9 31 987 13 1004
29 32 15 12 8791
15 23 25 7 7720

15 23 23 7
12 17 15 6
10 15 15 3
29 32 33 4
15 32 12 29
9 31 987 13
5 10 23 1
0 0 0 0
9 4
15 23 23 7 0001
12 32 15 5 2001
10 15 23 3 3725
12 17 15 6 0238
15 10 23 11 99674
29 32 33 4 00253
9 31 987 13 1004
29 32 15 12 8791
15 23 25 7 7720

15 23 23 7
12 17 15 6
10 15 15 3
29 32 33 4
15 32 12 29
9 31 987 13
5 10 23 1
0 0 0 0

输出样例:

tex
0001
0238
Pass
00253
Pass
1004
Pass
0001
0238
Pass
00253
Pass
1004
Pass

Solution:

java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String[] input = in.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);
        Map<String, String> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            input = in.readLine().split(" ");
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < m; j++) {
                sb.append(input[j]);
                if (j < m - 1) sb.append(" ");
            }
            map.put(sb.toString(), input[m]);
        }
        in.readLine();
        input = in.readLine().split(" ");
        while (!input[0].equals("0")) {
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < m; j++) {
                sb.append(input[j]);
                if (j < m - 1) sb.append(" ");
            }
            System.out.println(map.getOrDefault(sb.toString(), "Pass"));
            input = in.readLine().split(" ");
        }
    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String[] input = in.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);
        Map<String, String> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            input = in.readLine().split(" ");
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < m; j++) {
                sb.append(input[j]);
                if (j < m - 1) sb.append(" ");
            }
            map.put(sb.toString(), input[m]);
        }
        in.readLine();
        input = in.readLine().split(" ");
        while (!input[0].equals("0")) {
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < m; j++) {
                sb.append(input[j]);
                if (j < m - 1) sb.append(" ");
            }
            System.out.println(map.getOrDefault(sb.toString(), "Pass"));
            input = in.readLine().split(" ");
        }
    }
}

Released under the MIT License.