poj3349 Snowflake Snow Snowflakes

本文深入探讨了在编程比赛中遇到复杂问题时的应对策略,并分享了个人的反思与经验教训。从基本的语法错误到逻辑思路的偏差,作者详细分析了排查问题的方法,强调了在面对难题时保持冷静、系统地分析问题的重要性。同时,文章还讨论了如何避免常见的编程陷阱,以及如何在有限时间内高效解决问题。通过实例解析,读者可以学习到如何在实际编程过程中灵活运用这些技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击打开链接

题意:雪花有六角,每角有一个长度,每个雪花给出六个数代表六角长度,可以从任意个角开始沿顺时针或逆时针,n个雪花,问有没有可能有完全相同的。

分析:六个边加起来/hashsize,相同的归为一组,然后每一组判断有没有相同的,意义在于分组过程就排除了大量的情况,实现用vector好一些,我就不改了。

反思:做比赛时这题卡了很长时间最后也没出,这种情况经常出现,一些在自己能力范围之内的题因为找不着bug耽误时间,总结经验,抵bug的过程应该是这样的:在正确理解题意的前提下,1.先看有没有手下误,如没写&,for的循环变量写错,变量赋值和变化的顺序,2.数据范围,数组大小,边界处理等常见错误,3.排除以上两点,可能就是你的想法有问题了,这时应大胆怀疑自己的想法,如果整体想法正确,检查局部细节,可以排除一些确定正确的部分,认真思考一些值得怀疑的部分,检查自己的代码往往犯这样的错误,总认为自己是对的,所以一遍遍的检查没有结果。甚至有时候怀疑是题目自身的问题,这时应该明确,题没问题,还是自己的代码写挫了。(纯属牢骚)

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<map>
#include<algorithm>
#include<queue>
#include<set>
#define inf 10000000
#define PI acos(-1.0)
#define eps 1e-8
#define seed 131
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int,int> pii;
const int maxn=100005;
int n;
struct Node
{
    int s[6];
}node[maxn];
int p[1000][maxn];
bool xiangtong(Node& m,Node& n);
int main()
{
    scanf("%d",&n);
    int ans;
    for(int i=0;i<1000;i++)
        p[i][0]=0;
    for(int i=0;i<n;i++)
    {
        ans=0;
        for(int j=0;j<6;j++)
        {
            scanf("%d",&node[i].s[j]);
            ans+=node[i].s[j];
        }
        ans=ans%1000;
        p[ans][0]++;
        p[ans][p[ans][0]]=i;
    }
    for(int i=0;i<1000;i++)
    {
        if(p[i][0]<=1)
            continue;
        for(int j=1;j<p[i][0];j++)
        {
            for(int k=j+1;k<=p[i][0];k++)
            {
                if(xiangtong(node[p[i][j]],node[p[i][k]]))
                {
                    printf("Twin snowflakes found.\n");
                    return 0;
                }
            }
        }
    }
    printf("No two snowflakes are alike.\n");
    return 0;
}
/*bool xiangtong(int *a,int *b)
{
	int i,j;

    for(i=0; i<6; ++i)
    {
        for(j=0; j<6; ++j)
        {
            if(b[j]!=a[(i+j)%6])
                break;
        }
        if(j==6)
            return true;
        for(j=0; j<6; ++j)
        {
            if(b[j]!=a[(i+6-j)%6])
                break;
        }
        if(j==6)
            return true;
    }
    return false;
}*/
bool xiangtong(Node& m,Node& n)
{
    bool flag;
    for(int i=0;i<6;i++)
    {
        if(n.s[i]==m.s[0])
        {
            flag=true;
            for(int j=0,k=i;j<6;j++,k=(k+1)%6)
            {
                if(m.s[j]!=n.s[k])
                {
                    flag=false;
                    break;
                }
            }
            if(flag)
                return true;
            flag=true;
            for(int j=0,k=i;j<6;j++)
            {
                if(m.s[j]!=n.s[k])
                {
                    flag=false;
                    break;
                }
                if(k==0)
                    k=5;
                else
                    k=(k-1)%6;
            }
            if(flag)
                return true;
        }
    }
    return false;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值