华为机试:素数伴侣

陌路散爱 提交于 2020-03-03 01:15:38

算法

// A_Niu26素数伴侣.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include <iostream>
#include <cstring>
#include <vector>

using namespace std;
vector<int> G[105];
int pre[105];
bool used[105];

bool dfs(int k)
{
	for (int i = 0; i < G[k].size(); ++i)
	{
		if (used[G[k][i]] == 0)
		{
			used[G[k][i]] = 1;
			if (pre[G[k][i]] == 0 || dfs(pre[G[k][i]]))
			{
				pre[G[k][i]] = k;
				return true;
			}
		}
		else
			continue;
	}
	return false;
}

int main()
{
	//求小于8000的所有质数
	bool isprime[80000];
	memset(isprime, 0, sizeof(isprime));
	for (int i = 2; i <= 80000;i++)
	{
		int j;
		for (j = 2; j < i; j++)
		{
			if (i%j==0||j*j>i)
			{
				break;;
			}
		}

		//如果i没有公约数,则是质数
		if (j*j>i)
		{
			isprime[i] = 1;
		}
		
	}

				
	int N;
	int nums[105];
	int temp;

	while (cin >> N)
	{
		for (int i = 1; i <= N; ++i)
		{
			cin >> temp;
			nums[i] = temp;
		}

		for (int i = 0; i < 105;i++)
		{
			cout << "i:" << i << ",G[i]:" << "  ";
		}
		cout << endl;

		//匹配规则
		for (int i = 1; i <= N; ++i)
		{
			for (int j = i + 1; j <= N; ++j)
			{
				if (isprime[nums[i] + nums[j]])
				{
					if (nums[i] %2==1)
					{
						cout << "nums[i]:" << nums[i] << endl;
						G[i].push_back(j);
					}
					else {
						G[j].push_back(i);
					}
				}
					
			}
		}

		memset(pre, 0, sizeof(pre));
		int count = 0;
		for (int i = 1; i <= N; ++i)
		{
			memset(used, 0, sizeof(used));
			if (dfs(i))
				count++;
		}
		cout << count << endl;
		for (int i = 1; i <= N; ++i)
			G[i].clear();
	}
	return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!