剛剛參加完樂事筆試題,所以速度來吐槽一波,選擇題還是比較正常的,主要是編程題。我感覺牛客網的編程題老喜歡引入一個故事,導致文字很長很長,真的讓人的思維發散了,說實話我剛剛開始沒看懂第一題的題意,所以就放着沒做了,後來看懂了卻沒時間做了,所以現在把解題過程和大家分享一下。
題目太長,所以我就描述題目的要求。
一題:
1.第i個狂戰士可以剋制的魔兵神兵的集合爲Si(i取值爲[0,6])。
2.現在給出Si集合,讓我們找出分配方案,其中不能多個狂戰士攻擊一個巨魔神兵
例如輸入爲:
2 (集合數目)
01 23 (每個集合的情況)
輸出爲4;分配方案爲(02,03,12,13),其中02表示第一個狂戰對付第二個巨魔神兵,其他的依次類推。
2
01 01
輸出爲:2 分配方案爲(01,10)
我感覺主要是當時沒有理解題目,下面我就給出代碼:
解題思路比較簡單:就是判斷是否存在多個狂戰士是否同時攻擊一個巨魔神兵就行了,所以我使用unordered_set存放已經被對付過的巨魔神兵的編號,就行,若該巨魔神兵再次被挑戰就不符合題意,就得去找其他的分配方案。
#include <iostream>
#include <vector>
#include <unordered_set>
#include <string>
#include <assert.h>
#include <math.h>
using namespace std;
void getTimes(vector<string>& v,unordered_set<char>& s,int pos,int &nums)
{
if (pos == v.size())
{
++nums;
return;
}
for (int i = 0; i < v[pos].size(); ++i)
{
if (s.find(v[pos][i]) != s.end())
{
continue;
}
s.insert(v[pos][i]);
getTimes(v, s, pos + 1, nums);
s.erase(v[pos][i]);
}
}
int main()
{
int n = 0;
int sum = 0;
while (cin >> n)
{
vector<string> V;
unordered_set<char> S;
V.resize(n);
for (int i = 0; i < n; ++i)
{
cin >> V[i];
}
int nums = 0;
getTimes(V,S, 0, nums);
cout << nums << endl;
}
return 0;
}