新加的一道题,标准答案为把所有的数都试一遍。我的解法是把所有的可能性都加到一个set里面,这样避免了两个key允许的数重叠的情况,是一种偷懒的做法。
/*
ID: thestor1
LANG: C++
TASK: combo
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <climits>
#include <cassert>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
set<int> adjs(int d, int N)
{
std::set<int> fours;
fours.insert(d);
fours.insert((d - 1 + N - 1) % N + 1);
fours.insert((d - 1 + N - 2) % N + 1);
fours.insert((d - 1 + N + 1) % N + 1);
fours.insert((d - 1 + N + 2) % N + 1);
return fours;
}
int tohash(int d1, int d2, int d3, int N)
{
return d1 * (N + 1) * (N + 1) + d2 * (N + 1) + d3;
}
int main()
{
ifstream fin("combo.in");
ofstream fout("combo.out");
int N;
fin>>N;
std::vector<vector<int> > keys(2, std::vector<int>(3, 0));
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 3; ++j)
{
int dial;
fin>>dial;
keys[i][j] = dial;
}
}
// for (int i = 0; i < 2; ++i)
// {
// cout<<"key "<<i<<":";
// for (int j = 0; j < 3; ++j)
// {
// cout<<keys[i][j]<<"\t";
// }
// cout<<endl;
// }
set<int> validkeys;
for (int k = 0; k < 2; ++k)
{
set<int> firstadjs = adjs(keys[k][0], N);
set<int> secondadjs = adjs(keys[k][1], N);
set<int> thirdadjs = adjs(keys[k][2], N);
for (set<int>::iterator iter1 = firstadjs.begin(); iter1 != firstadjs.end(); ++iter1)
{
for (set<int>::iterator iter2 = secondadjs.begin(); iter2 != secondadjs.end(); ++iter2)
{
for (set<int>::iterator iter3 = thirdadjs.begin(); iter3 != thirdadjs.end(); ++iter3)
{
// cout<<*iter1<<", "<<*iter2<<", "<<*iter3<<endl;
int h = tohash(*iter1, *iter2, *iter3, N);
validkeys.insert(h);
}
}
}
}
fout<<validkeys.size()<<endl;
fin.close();
fout.close();
return 0;
}