题解 CF962C 【Make a Square】

这是一个深搜的模板题。

首先,我们发现n的位数很小,只有9位。于是我们想到了深搜算法。

首先,把n拆分成数组,记n的数位个数位$|n|$。

枚举$|n|$个元素的全排列。

之后我们判定。

一个是完全平方数当且仅当 
$\left\lfloor\sqrt(x)\right\rfloor$ = $\sqrt(x)$

于是对于每一个全排列,把他们拼起来,然后判定即可

注意要去除前导零和长度为0的情况。

代码中,存放排列使用$vector$实现的

 

// Author : harry
// Language : C++ (GNU C++ 11)
// Upload : CodeForces / luogu
// Time : 2018.9
// Problem : Make a Square
// Tell Myself : Think Twice Code Once
// All rights reserved

#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <cctype>
#include <string>
#include <cstring>
#include <cassert>
#include <climits>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std ;

#define rep(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
#define Rep(i,a,b) for (int (i)=(a)-1;(i)<(b);(i)++)
#define REP(i,a,b) for (int (i)=(a);(i)>=(b);(i)--)
#define reg(i,x) for (int (i)=head[x];(i);i=e[i].next)

#define ull unsigned long long
#define ll long long
#define ls ((x)<<1)
#define rs ((x)<<1|1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define endl '\n'
#define Pii pair<int,int>

const int N = 100010 ;
const int iinf = INT_MAX/2 ;
const ll linf = LONG_MAX/2 ;
const int MOD = 1e9+7 ;

inline int read(){
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}

void write(int x){
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}

int a[20] ;
int n,ans=-1,x ;
vector<int> b ;

void init(int x){
	while(x) a[++n]=x%10,x/=10 ;
	reverse(a+1,a+n+1) ;
}

bool judge(int m){ //判定是不是完全平方数
    double x=sqrt(m);
    if (floor(x)==x) return 1;
    return 0;
}

bool check(vector<int> dig){ //判定
	int tmp=0 ;
	for (int i=0;i<dig.size();i++) tmp=tmp*10+dig[i] ;
	if (dig.size()==0 || dig[0]==0 || !judge(tmp)) return 0 ;
	return 1 ;
}

void dfs(int k,vector<int> dig){ //深搜
	if (k==n+1){
		if (check(dig)) ans=max(ans,(int)dig.size());
		return ;
	}
	dfs(k+1,dig);
	dig.pb(a[k]);dfs(k+1,dig) ;
}

int main(){
	scanf("%d",&x) ;
	init(x) ;
	dfs(1,b) ;
	if (ans==-1) printf("-1\n") ;
	else printf("%d\n",n-ans) ;
}
posted @ 2018-09-12 21:43  harryhqg  阅读(354)  评论(0编辑  收藏  举报