樂事在線筆試題

    剛剛參加完樂事筆試題,所以速度來吐槽一波,選擇題還是比較正常的,主要是編程題。我感覺牛客網的編程題老喜歡引入一個故事,導致文字很長很長,真的讓人的思維發散了,說實話我剛剛開始沒看懂第一題的題意,所以就放着沒做了,後來看懂了卻沒時間做了,所以現在把解題過程和大家分享一下。

    題目太長,所以我就描述題目的要求。

    一題:    

      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;
}

發佈了194 篇原創文章 · 獲贊 88 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章