1. 程式人生 > >【藍橋杯】第七屆國賽C語言B組 2.湊平方數(dfs+STL)

【藍橋杯】第七屆國賽C語言B組 2.湊平方數(dfs+STL)

ble 一個 所有 mes char next memset target article

把0~9這10個數字,分成多個組,每個組恰好是一個平方數,這是能夠辦到的。
比如:0, 36, 5948721

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

註意,0可以作為獨立的數字,但不能作為多位數字的開始。
分組時,必須用完所有的數字,不能重復,不能遺漏。

如果不計較小組內數據的先後順序,請問有多少種不同的分組方案?

註意:需要提交的是一個整數,不要填寫多余內容。

仍然沒什麽思路 很久沒寫代碼 真的都退化了

代碼來源:https://blog.csdn.net/riba2534/article/details/72480145

 1 #include <bits/stdc++.h>
 2
#define ll long long 3 4 using namespace std; 5 6 int a[10] = {0,1,2,3,4,5,6,7,8,9}; 7 ll n1[10]; 8 set<string>s; 9 10 void dfs(int step,int num) 11 { 12 if(step == 10) // 用完了10個數 13 { 14 ll n2[10]; 15 for(int i = 0;i < num;i++) 16 { 17 n2[i] = n1[i];
18 } 19 sort(n2,n2+num); 20 string xu; 21 char str[100]; 22 for(int i = 0;i < num;i++) 23 { 24 sprintf(str,"%lld",n2[i]); // 轉換成字符串 25 xu += str; 26 xu += "-"; 27 } 28 cout << xu << endl; 29
s.insert(xu); 30 return ; 31 } 32 if(a[step] == 0) 33 { 34 n1[num] = 0; 35 dfs(step+1,num+1); 36 } 37 else 38 { 39 ll sum = 0; 40 for(int i = step;i < 10;i++) 41 { 42 sum = sum*10+a[i]; // 算出當前所得到的值 43 double son = sqrt(sum); 44 if(son == (int)son) 45 { 46 n1[num] = sum; 47 dfs(i+1,num+1); 48 } 49 } 50 } 51 } 52 53 int main() 54 { 55 do 56 { 57 memset(n1,0,sizeof(n1)); 58 dfs(0,0); 59 } 60 while(next_permutation(a,a+10)); 61 cout << s.size() << endl; 62 return 0; 63 }

【藍橋杯】第七屆國賽C語言B組 2.湊平方數(dfs+STL)