阿里巴巴 出撲克牌筆試題


阿里巴巴筆試題

阿里的筆試真的有點難,兩道筆試題一個小時,感覺只能做出一道題來,筆試的時候也沒做出來,結束了之后理清思路花了一小時才寫好

  1. 一副撲克牌,總共有 A 2 3 4 5 6 7 8 9 每張牌各4張,從中抽取任意張牌,牌可以有四種出法

    1. 單張牌,比如說 A
    2. 一對牌,比如說 兩個2
    3. 五張牌順子,比如說 A 2 3 4 5
    4. 六張牌連對,比如說 A A 2 2 3 3

    現在輸入是10種牌每張牌的個數,如 1 1 1 2 2 2 2 2 1 1 ,指的是這10張牌每張的個數,現在問最少出幾次能把牌出完。

    此時的解答是3次,出3個順子可以達到目標。

    深度優先加回溯

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int find6(vector<int> datas, int start, int& loc)
    {
    	if (start >= 8)
    		return 0;
    	int min = 10;
    	int times = 0;
    	for (int i = start; i < 10; i++)
    	{
    		if (datas[i] < min )	min = datas[i];
    		if (min < 2)
    		{
    			min = 10;
    			times = 0;
    		}
    		else
    		{
    			times++;
    			if (times == 3)
    			{
    				loc = i - 2;
    				if (min == 4)
    					return 2;
    				else
    					return 1;
    			}
    		}
    	}
    	return 0;
    }
    void sub6(vector<int>& datas, int loc, int times)
    {
    	datas[loc] -= 2*times;
    	datas[loc+1] -= 2*times;
    	datas[loc+2] -= 2*times;
    }
    
    void add6(vector<int>& datas, int loc) {
    	datas[loc] += 2;
    	datas[loc + 1] += 2;
    	datas[loc + 2] += 2;
    }
    
    int find5(vector<int> datas, int start, int& loc)
    {
    	if (start >= 6)
    		return 0;
    	int min = 10;
    	int times = 0;
    	for (int i = start; i < 10; i++)
    	{
    		if (datas[i] < min)	min = datas[i];
    		if (min == 0)
    		{
    			min = 10;
    			times = 0;
    		}
    		else
    		{
    			times++;
    			if (times == 5)
    			{
    				loc = i - 4;
    				return min;
    			}
    		}
    	}
    	return 0;
    }
    void sub5(vector<int>& datas, int loc,int times)
    {
    	datas[loc] -= times;
    	datas[loc + 1] -= times;
    	datas[loc + 2] -= times;
    	datas[loc + 3] -= times;
    	datas[loc + 4] -= times;
    }
    
    void add5(vector<int>& datas, int loc) {
    	datas[loc] += 1;
    	datas[loc + 1] += 1;
    	datas[loc + 2] += 1;
    	datas[loc + 3] += 1;
    	datas[loc + 4] += 1;
    }
    
    
    void dfs(vector<int>& datas, int& min, int cur, int step,int start)
    {
    	int loc = 0;
    	if (step == 0)
    	{
    		if (start >= 8)
    		{
    			dfs(datas,min, cur, 1, 0);
    		}
    		else
    		{
    			int nums = find6(datas, start, loc); //loc 是指的找到了並開始的地方
    			if (nums == 0)
    			{
    				dfs(datas, min, cur, 1, 0);
    			}
    			else
    			{
    				int n = nums;
    				sub6(datas, loc, nums);
    				while (n)
    				{
    					dfs(datas, min, cur + n, 0, loc + 1);
    					add6(datas, loc);
    					n--;
    				}
    				dfs(datas, min, cur, 0, loc + 3);
    			}
    		}
    	}
    	else if (step == 1)
    	{
    		if (start >= 6)
    		{
    			dfs(datas, min, cur, 2, 0);
    		}
    		else
    		{
    			int nums = find5(datas, start, loc); //loc 是指的找到了並開始的地方
    
    			if (nums == 0)
    			{
    				dfs(datas, min, cur, 2, 0);
    			}
    			else
    			{
    				int n = nums;
    				sub5(datas, loc, nums);
    				while (n)
    				{
    					dfs(datas, min, cur + n, 1, loc + 1);
    					add5(datas, loc);
    					n--;
    				}
    				dfs(datas, min, cur, 1, loc + 5);
    			}
    		}
    	}
    	else
    	{
    		int nums = 0;
    		for (int i = 0; i < 10; i++)
    		{
    			if (datas[i] > 0 && datas[i] <= 2)
    			{
    				nums++;
    			}
    			else if (datas[i] > 2 && datas[i] <= 4)
    			{
    				nums += 2;
    			}
    		}
    		cur += nums;
    		if (min > cur)
    			min = cur;
    	}
    }
    
    int main()
    {
    	vector<int>  datas(10);
    	for (int i = 0; i < 10; i++)
    	{
    		cin >> datas[i];
    	}
    	int min = 50;
    	dfs(datas,min,0,0,0);
    	cout << min;
    }
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM