[POJ 3349]Snowflake Snow Snowflakes[hash]
제목 분석:
제 시 된 n 송이 눈송이 중 두 송이 가 똑 같은 지 판단 합 니 다.
문제 풀이 방향:
이상 적 인 방법 은 모든 길이 가 같은 것 을 함께 놓 고 위치 가 같은 지 판단 하 는 것 이다.그러나 이렇게 하면 분명히 hash 의 난이 도 를 높 였 기 때문에 우 리 는 길이 와 같은 전략 을 채택 했다.
그리고 같은 길이 와 아래 두 송이 모두 순서대로 역순 으로 판단 한다.
개인 적 인 느낌:
주로 어떻게 해 야 할 지 모 르 겠 어 요.
구체 적 인 코드 는 다음 과 같다.
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<string>
using namespace std;
const int INF = 0x7f7f7f7f;
const int MAXN = 1e5 + 111;
const int BASE = 99991;
struct Snow {
int len[6];
}snow;
vector<Snow> hashtable[BASE];
bool ok(Snow &a, Snow &b) {
for (int i = 0; i < 6; ++i) {
//
bool flag = 1;
for (int j = 0; j < 6; ++j) {
if (a.len[j] != b.len[(j + i) % 6]) {
flag = 0;
break;
}
}
if (flag) return 1;
//
flag = 1;
for (int j = 0; j < 6; ++j) {
if (a.len[5 - j] != b.len[(j + i) % 6]) {
flag = 0;
break;
}
}
if (flag) return 1;
}
return 0;
}
int main()
{
#ifdef LOCAL
freopen("C:\\Users\\apple\\Desktop\\in.txt", "r", stdin);
#endif
int n;
scanf("%d", &n);
while (n --) {
int sum = 0;
for (int i = 0; i < 6; ++i) {
scanf("%d", &snow.len[i]);
sum += snow.len[i];
sum %= BASE;
}
hashtable[sum].push_back(snow);
}
for (int i = 0; i < BASE; ++i) {
if (hashtable[i].size() > 1) {
for (int j = 0; j < hashtable[i].size(); ++j) {
for (int k = j + 1; k < hashtable[i].size(); ++k) {
if (ok(hashtable[i][j], hashtable[i][k])) {
printf("Twin snowflakes found.
");
return 0;
}
}
}
}
}
printf("No two snowflakes are alike.
");
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.