古老的智力題。。。

#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(nlog2n)滿 O(nlog^2n)(反正這個複雜度是假的。。。可能沒這麼滿)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章