• 雪花是否一样问题


    一 原问题链接

    SnowflakeSnowSnowflakes - POJ 3349 - Virtual Judgehttps://vjudge.net/problem/POJ-3349

    二 输入和输出

    1 输入

    输入的第1行包含一个整数,表示雪花的数量。接下来的n行,每行都描述一片雪花。每片雪花都包含 6 个整数,表示雪花的花瓣长度。花瓣的长度都将围绕雪花的顺序给出(顺时针或逆时针),但他们可以从 6 个花瓣的任何一个开始。例如,相同的雪花可以被描述为 1 2 3 4 5 6 或 4 3 2 1 6 5

    2 输出

    如果所有的雪花都不同,则输出“No two snowflakes are alike”,否则输出“Twin snowflakes found.”

    三 输入和输出样例

    1 输入样例

    2

    1 2 3 4 5 6

    4 3 2 1 6 5

    2 输出样例

    Twin snowflakes found.

    四 分析

    本问题可以采用哈希表和 vector 解决,也可以采用哈希表和链式前向星解决。

    五 算法设计

    1 将雪花的六个花瓣长度求和,然后 mod 一个较大的质数 P,例如 100003 或 100007

    2 在哈希表 key 相同的链中查询是否有相同的,如果有则查询是否有相同的,如果有则返回1,否则将关键字添加到 Hash 表中。

    3 比较相同时,从顺时针方向和逆时针方向判断

    4 以哈希表处理冲突时采用链地址法。采用 vector 或链式前向星都可,但 vector 速度较慢。

    六 代码

    1. package poj3349;
    2. import java.util.Scanner;
    3. public class Poj3349 {
    4. static final int maxn = 100010;
    5. static final int P = 100007;
    6. static int head[] = new int[P];
    7. static int cnt;
    8. static int snow[][] = new int[maxn][6];
    9. static int n;
    10. static node e[] = new node[maxn];
    11. static {
    12. cnt = 0;
    13. for (int i = 0; i < head.length; i++) {
    14. head[i] = -1;
    15. }
    16. for (int i = 0; i < e.length; i++) {
    17. e[i] = new node();
    18. }
    19. }
    20. // 将下标 i 添加到值为 val 的链表中
    21. static void addhash(int val, int i) {
    22. e[++cnt].to = i;
    23. e[cnt].next = head[val];
    24. head[val] = cnt;
    25. }
    26. static int cmp(int a, int b) {
    27. int i, j;
    28. for (i = 0; i < 6; i++) {
    29. if (snow[a][0] == snow[b][i]) {
    30. for (j = 1; j < 6; j++) // 顺时针
    31. if (snow[a][j] != snow[b][(j + i) % 6])
    32. break;
    33. if (j == 6) return 1;
    34. for (j = 1; j < 6; j++)//逆时针
    35. if (snow[a][6 - j] != snow[b][(j + i) % 6])
    36. break;
    37. if (j == 6) return 1;
    38. }
    39. }
    40. return 0;
    41. }
    42. static boolean find(int i) {
    43. int key, sum = 0;
    44. for (int j = 0; j < 6; j++)
    45. sum += snow[i][j];
    46. key = sum % P;
    47. for (int j = head[key]; j != -1; j = e[j].next) {
    48. if (cmp(i, e[j].to) == 1)
    49. return true;
    50. }
    51. addhash(key, i);
    52. return false;
    53. }
    54. public static void main(String[] args) {
    55. Scanner scanner = new Scanner(System.in);
    56. n = scanner.nextInt();
    57. int flag = 0;
    58. int sum, key;
    59. for (int i = 0; i < n; i++) {
    60. for (int j = 0; j < 6; j++)
    61. snow[i][j] = scanner.nextInt();
    62. if (find(i)) {
    63. flag = 1;
    64. break; // 如果多组测试用例,则 continue 继续读入
    65. }
    66. }
    67. if (flag == 1)
    68. System.out.println("Twin snowflakes found.");
    69. else
    70. System.out.println("No two snowflakes are alike.");
    71. return;
    72. }
    73. }
    74. class node {
    75. int to;
    76. int next;
    77. }

    七 测试结果

  • 相关阅读:
    STM32WB55开发(2)----修改蓝牙地址
    【时区】Flink JDBC 和CDC时间字段时区 测试及时间基准
    uni-app详解
    Git获取执行结果并自动化merge提交
    vue-admin相关问题记录
    2023华为杯研究生数学建模D题思路代码分析
    【笔记】Spring Boot 历史官方文档学习(持续更新)
    HarmonyOS之运行Hello World
    信创迁移适配实战-SpringBoot服务以war包部署后无法注册到Consul
    解决:vue-cli-service不是内部或外部命令
  • 原文地址:https://blog.csdn.net/chengqiuming/article/details/126063659