凑平方数

今天看到一个题目,感觉挺好玩的,做了一下。

题目

凑平方数

把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等…
注意,0可以作为独立的数字,但不能作为多位数字的开始。
选自第七届蓝桥杯B组第二题(填空题)

好像先预处理,在进行暴力搜索没啥问题,重点是long long int 真坑,调试了半天
预处理:筛选出1-\(\sqrt {9876543210}\)的所有平方数,注意这里还可以更加细节的筛,考虑0-9这10个数字都不一样,可以在预处理中将重复的删除比如\(\sqrt{100}=10\),这个数就不行,怎么凑都不可能凑到完全不一样的数
DFS:暴力枚举各种可能性 好吧我不会表述
set:set是用来判重的,反正重复丢到set里去也没有的,可以用hashset,然后统计下数字就出来惹,答案是300。
付下代码

#include<bits/stdc++.h>
using namespace std;
const int MAXV = 100001;
long long int nums[MAXV];
int books[10];
int cut;
void make_1(long long int);
int Part_1(int);
int init(long long int x)
{
	int cut = 0;
	for (long long int i = 0; i <= sqrt(x); i++)
	{
		int flag = 1;
		memset(books, 0, sizeof books);
		long long int k = i * i;
		make_1(k);
		for(int i=0;i<10;i++)
			if (books[i] > 1)
			{
				flag = 0;
				break;
			}
		if(flag==0)
			continue;
		 nums[cut++] =k;
	}
	return cut;
}

void make_1(long long int x)
{
	do 
	{
		int k = x % 10;
		books[k]++;
		x = x / 10;
	} while (x);
}

void make_0(long long int x)
{
	do 
	{
		int k = x % 10;
		books[k]--;
		x = x / 10;
	} while (x);
}

int total_1(int books[10])
{
	int i = 0;
	while (books[i] == 1)
		i++;
	if (i == 10)
		return 1;
	return 0;
}

int Part_1(int x)
{
	do 
	{
		int k = x % 10;
		if (books[k] > 1)
			return 1;
		x = x / 10;
	} while (x);
	return 0;
}
int mynum = 0;
vector<long long int>result(10);
set<long long int>xx;
set<set<long long int> >yy;
void dfs(int k)
{
	for (int i = 0; i < 10; i++)
		if (books[i] > 1)
			return;
	if (total_1(books) == 1)
	{
		xx.clear();
		for (int i = 0; i < k; i++)
			xx.insert(result[i]);
		/*打印看看*/
		/*
		for (auto iter = xx.begin(); iter != xx.end(); ++iter)
			cout << *iter << " ";
		cout << endl;
		*/
		yy.insert(xx);
		return;
	}
	for (int i=0; i < cut; ++i)
	{
		make_1(nums[i]);
		result[k]=nums[i];
		dfs(k+1);
		make_0(nums[i]);
	}
}
int main()
{
	cut=init(9876543210);
	//看看预处理对不对
	/*
	for (int i = 0; i < cut; i++)
		cout << nums[i] << " ";
	cout << endl;
	*/
	//预处理后要清0一下
	memset(books, 0, sizeof books);
	dfs(0);
	cout << yy.size();
}

还有,高数好难,不会写,哭了

posted @ 2019-01-29 15:37  ~abc~  阅读(563)  评论(0)    收藏  举报