古老的智力题。。。

#include<bits/stdc++.h>
using namespace std;

int a[15];
int zz[15] = {0 , 1 , 2 , 4 , 7 , 6};

int check(int num , int tp){
	//tp 1: 检测num是否是质数 
	if(tp == 1){
		for(int i = 2 ; i <= sqrt(num) ; i++)if(num % i == 0)return 2;
		return 1;	
	}
	//tp 2: 检测num是否是 阶乘
	if(tp == 2){
		for(int i = 1 , hh = 1;hh <=num ; i++){
			hh = hh * i;
			if(hh == num)return 1;
		}
		return 2;	
	} 
	//tp 3: 检测num是否是 平方数
	if(tp == 3){
		int zz = sqrt(num);
		if(zz * zz == num)return 1;
		return 2;
	}
	//tp 4: 检测num是否是 立方数
	if(tp == 4){
		if(num == 0)return 1;
		if(num == 1)return 1;
		if(num == 8)return 1;
		return 2;
	}
	//tp 5: 检测num是否是 5的倍数 
	if(tp == 5){
		if(num % 5 == 0)return 1;
		return 2;
	}
	return 2;
}

int dfs(int now){
	if(now == 11){ 
		//查找1===6 
		if(a[a[1] + 1] != 2)return 0;
		for(int i = 1; i <= a[1] ; i++)if(a[i] == 2)return 0;
		
		
		if(a[a[2] + 1] != a[a[2] + 2])return 0;
		
		if(a[3] != a[zz[a[3]]])return 0;
		
		int sum[6];
		sum[1] = sum[2] = sum[3] = sum[4] = sum[5] = 0;
		for(int i = 1 ; i <= 10 ; i++)if(a[i] == 1)sum[1]++;
		
		if(sum[1] != a[4] - 1)return 0;
		
		if(a[5] != a[11 - a[5]])return 0;
		
		for(int i = 1 ; i <= 10 ; i++)if(a[i] == 2)sum[2]++;
		for(int i = 1 ; i <= 10 ; i++)if(a[i] == 3)sum[3]++;
		for(int i = 1 ; i <= 10 ; i++)if(a[i] == 4)sum[4]++;
		for(int i = 1 ; i <= 10 ; i++)if(a[i] == 5)sum[5]++;
		
		if(a[6] != 5 && sum[1] != sum[a[6] + 1] )return 0;
		
		if(a[6] == 5)for(int i = 2 ; i <= 5 ; i++)if(sum[1] == sum[i])return 0;
		
		if((5 - a[7]) != abs(a[7] - a[8]))return 0;
		
		if((a[8] + 1) != sum[1] + sum[5])return 0;
		
		if(check(sum[2] + sum[3] + sum[4] , a[9]) == 2)return 0;
		
		for(int i = 1 ; i <= 10 ; i++){
			cout<<i<<"  "<<a[i]<<endl;
		}
		cout<<endl;
		return 0;
	}
	for(int i = 1 ; i <= 5 ; i++){
		a[now] = i; 
		dfs(now + 1);
	}
} 

int main(){
	dfs(1);
} 

对了,这个题引出了一个问题。。。
怎么判断一个数是不是立方数()。。。

一个比较真的做法是枚举素因子。。。
然后像线性筛一样枚举倍数
大体复杂度在
O ( n l o g 2 n ) ( 反 正 这 个 复 杂 度 是 假 的 。 。 。 可 能 没 这 么 满 ) O(nlog^2n)(反正这个复杂度是假的。。。可能没这么满) O(nlog2n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值