2016年蓝桥杯决赛 凑平方数



凑平方数


把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721


再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...


注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。


如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?


注意:需要提交的是一个整数,不要填写多余内容。



这种就直接全排列然后深搜。

自己出现的问题:

1.    0没有处理好,如果0出现在中间,最后有可能会导致增多,注意0

2.    越界。。这个BUG调了好多时间没调整好,一个一个输出一点一点找错。发现是越界

      把int换成long long。

3.   最后判重直接把得到数组,我是储存在fz【】数组里,然后排序,存入set容器,这点要注意一下

因为同一种顺序有可能有不同的组合方法,所以在每个数字的后面加一个‘,’然后存入set<string> s;容器中



如果自己考试时候做真不一定能做出来,太不细心了


#include<iostream>
#include<algorithm>
#include<set>
#include<cmath>
#include<stack>
#include<string>
using namespace std;
int a[11]={0,1,2,3,4,5,6,7,8,9};
long long fz[100]={0};
set<string> s;
void f(int n,int k){
	if(n==9){
		/*for(int i=0;i<k;i++){
			cout<<fz[i]<<" ";
		}*/
		long long fz2[100]={0};
		for(int i=0;i<k;i++)
		 fz2[i]=fz[i];
		sort(fz2,fz2+k);
		string str="";
		//set<int> ss;
		for(int i=0;i<k;i++){
			stack<int> sta;
			if(fz2[i]==0)
			str+=0+'0';
			//ss.insert(0);
			long long num=fz2[i];
			while(num){
				sta.push(num%10);
				//ss.insert(num%10);
				num/=10;
			}
			while(sta.size()){
				str+=sta.top()+'0';
				sta.pop();
			}
			str+=',';
		}
		//if(ss.size()==10)
		s.insert(str);
		return ;
	}
	if(n==-1&&a[0]==0){
		fz[0]=0;
		f(0,1);
	}
	else{
			long long sum=0;
			for(int j=n+1;j<10;j++){
				sum=sum*10+a[j];
				if(sum==0){
					fz[k]=sum;
					f(j,k+1);
					break;
				} 
				long long in=sqrt(sum);
				if(in*in==sum){
					fz[k]=sum;
					f(j,k+1);
				}
			}
	}
}
int main(){
	do{
		f(-1,0);
	}while(next_permutation(a,a+10));
	cout<<s.size();
	return 0;
}



欢迎大家加入 早起学习群,一起学习一起进步!(群号: 642179511


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值