最小表示法,以及二维数组的比较方法

雪花雪花雪花 用到的是最小表示法

有N片雪花,每片雪花由六个角组成,每个角都有长度。

第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,…,ai,6。

因为雪花的形状是封闭的环形,所以从任何一个角开始顺时针或逆时针往后记录长度,得到的六元组都代表形状相同的雪花。

例如ai,1,ai,2,…,ai,6和ai,2,ai,3,…,ai,6,ai,1就是形状相同的雪花。

ai,1,ai,2,…,ai,6和ai,6,ai,5,…,ai,1也是形状相同的雪花。

我们称两片雪花形状相同,当且仅当它们各自从某一角开始顺时针或逆时针记录长度,能得到两个相同的六元组。

求这N片雪花中是否存在两片形状相同的雪花。

输入格式
第一行输入一个整数N,代表雪花的数量。

接下来N行,每行描述一片雪花。

每行包含6个整数,分别代表雪花的六个角的长度(这六个数即为从雪花的随机一个角顺时针或逆时针记录长度得到)。

同行数值之间,用空格隔开。

输出格式
如果不存在两片形状相同的雪花,则输出:

No two snowflakes are alike.

如果存在两片形状相同的雪花,则输出:

Twin snowflakes found.

数据范围
1≤n≤100000 ,
0≤ai,j<10000000
输入样例:
2
1 2 3 4 5 6
4 3 2 1 6 5
输出样例:
Twin snowflakes found.

令着几组数,都找到自己字符串字典序最小的表示法,如果有一样的,就是相同的;

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<stdio.h>
    using namespace std;
    const int N=100010;
    int snows[N][6],isnow[6],snow[6],idx[N];
    bool cmp_array(int a[],int b[])
  //与下面的cmp函数一同构成二维数组比较的一个方法。很强
    {   for(int i=0;i<6;i++)
        if(a[i]>b[i])
        return false;
        else if(a[i]<b[i])
        return  true;
        return false;
    }
    bool cmp(int a,int b)
    {
        return cmp_array(snows[a],snows[b]);
    }
    void get_min(int a[])//最小表示法,找到这个字符串中字典序最小的。比如abca 可以出来很多循环同构的字符串'abca''aabc''caab''bcaa';其中字典序最小的就是aabc,这个就是最小表示法是得到的结果
    {
        int n=6;
        static  int b[12];
        for(int i=0;i<12;i++)b[i]=a[i%6];//先把要找最小表示法的数组复制一遍到自己的元素组后面,成为b数组。
         int i=0,j=1,k;
         while(i<n&&j<n)
         {
             for(k=0;k<n&&b[i+k]==b[j+k];k++);//如果i下标和j下标表示的一样的话,就让k增加
             if(k==n)
             break;
             if(b[i+k]>b[j+k]){//如果i下标的数大于j下标的数,那么,i就跳过k个数,另找小的数,因为j下标的数小于i下标的数,i就不能是最小表示法
                 i=i+k+1;
                 if(i==j)
                 i++;
             }
             else{
                 j=j+k+1;
                 if(i==j) j++;
             }

         }
         k=min(i,j);//找到最小的下标给
         for(int i=0;i<6;i++)
         a[i]=b[i+k];

    }

    int main(){
        int n;
      cin>>n;
      for(int i=0;i<n;i++)
      {
          for(int j=0,k=5;j<6;j++,k--)
          {
              scanf("%d",&snow[j]);
               isnow[k]=snow[j];
          }
        get_min(snow);
        get_min(isnow);
        if(cmp_array(snow,isnow))memcpy(snows[i],snow,sizeof(snow));
        else memcpy(snows[i],isnow,sizeof(isnow));
          idx[i]=i;
      }
        sort(idx,idx+n,cmp);//二维数组的大小比较
        bool flag=false;
        for(int i=1;i<n;i++)
        {
            if(!cmp(idx[i-1],idx[i])&&!cmp(idx[i],idx[i-1]))//如果两个最小表示法得出的数都一样,那么就是有两个雪花一样的
            {
                flag=true;
                break;
            }
        }
        if(flag)puts("Twin snowflakes found.");
        else
        puts("No two snowflakes are alike.");
        return 0;

    }

原文地址:https://www.cnblogs.com/arbor-one/p/12268344.html

时间: 2024-08-29 22:38:57

最小表示法,以及二维数组的比较方法的相关文章

C语言 数组输出,冒泡排序法,沉底排序法,二维数组输出,输出字母列长度,从随机数组中找重复数

#include <stdio.h> #define sum 3+4//宏定义是原封不动的使用used for test4 #include <time.h>//used for test8~9 #include <stdlib.h>//used for test8~9 void test(){//数组输出 //int a[5]={1,2,3,4,5}; printf("array output,look,please...\n"); int a[1

PHP二维数组去重的方法(保留各个键值的同时去除重复的项)-- 二维数组的唯一性

对于如下二维数组,要求对其进行去重: $arr = array( '0'=>array( 'name'=>'james', 'age'=>30, ), '1'=>array( 'name'=>'susu', 'age'=>26, ), '2'=>array( 'name'=>'james', 'age'=>30, ), 'new'=>array( 'name'=>'kube', 'age'=>37, ), 'list'=>arr

C++中动态申请二维数组并释放方法

C/C++中动态开辟一维.二维数组是非常常用的,以前没记住,做题时怎么也想不起来,现在好好整理一下. C++中有三种方法来动态申请多维数组 (1)C中的malloc/free (2)C++中的new/delete (3)STL容器中的vector 下面逐一介绍: 第一种:malloc/free 1.动态开辟一维数组 [cpp] view plaincopy //动态开辟一维数组 void dynamicCreate1Array() { int m; int i; int *p; printf("

php获取一维,二维数组长度的方法(有实例)

在php中获取数组长度方法很简单,php为我们提供了两个函数可以计算一维数组长度,如count,sizeof都可以直接统计数组长度哦,下面我们来看几个实例吧.php如何获取数组的长度,使用php函数count(),或是sizeof()例如: 复制代码代码如下: $arr = Array('0','1','2','3','4'); echo count($arr);// 输出 5$arr = array('A','B','C');echo sizeof($arr);//输出3 sizeof()和c

剑指 offer 第一题: 二维数组中的查找

打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣 ?? 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析 图 1 如果没有头绪的话,很显然使用 暴力解法 是完全可以解决该问题的. 即遍历二维数组中的每一个元素,时间复杂度:O(n^2). 其实到这里我们就可以发现,使用这种暴力解法并没有充分利用题目给出的信息.这

flash 定义二维数组

一种二维数组的定义方法 //假设二维数组为 [5][7]var  xn:Number = 5;var  yn:Number = 7; //定义一数值变量var  temp:Number = 0; //定义我们的二维数组var  myArray:Array = new Array(); //填充二维数组for(var  i=0;i<xn;i++){  myArray[i] = new Array();  for(var  j=0;j<yn;j++){    myArray[i][j] = tem

iOS-C_Day7___数组与二维数组

数组与函数 //1.给定某个字符数组,统计数组中所有英文字符的个数,比如“123fdd”中有 3 个. //数组作为函数的接口参数, 数组的长度丢失 #include <string.h> int numberOfCharacter(char src[], int len) { int cnt=0; for (int i=0; i<len; i++) { if ((src[i]>='A' && src[i]<='Z') || (src[i]>='a' &

二维数组的遍历

方法1: 1 /************************************************************************* 2 > File Name: ptrmulti.c 3 > Author: Mr.Yang 4 > Purpose:使用指针来将数组传递给函数 5 > Created Time: 2017年06月04日 星期日 08时51分15秒 6 *******************************************

php对二维数组进行相关操作(排序、转换、去空白等)

php对二维数组进行相关操作(排序.转换.去空白等) 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-11-04 这篇文章主要介绍了php对二维数组进行相关操作,包括php对二维数组排序.转换.去空白,以及去重复值等,感兴趣的小伙伴们可以参考一下 技巧提示: ? 1 2 3 4 5 6 7 8 9 array_keys($array) //返回所有键名   array_values($array) //返回所有键值    $result=array_reverse($inp