您的位置:首页 > 其它

USACO Combination Lock 解题报告

2014-10-04 04:45 344 查看
新加的一道题,标准答案为把所有的数都试一遍。我的解法是把所有的可能性都加到一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: