在藍橋杯的題目中大多數都可以運用到全排列函數 充分運用可以節省很多的時間。話不多說來刷題
三羊獻瑞 觀察下面的加法算式: 祥 瑞 生 輝
三 羊 生 瑞 氣 (如果有對齊問題,可以參看【圖1.jpg】)其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多余內容。
看到這題一看就知道用暴力搜索法,代碼如下
#include<iostream>using namespace std;int check(int num[],int n){ for(int i = 0; i < n; i++) { if(num[i]==num[n]) { return 0; } } return 1;}int main(){ int num[8]; int count = 0; for(num[0] = 1; num[0] <=9; num[0]++) { if(check(num,0)) for(num[1] = 0; num[1] <=9; num[1]++) { if(check(num,1)) for(num[2] = 0; num[2] <=9; num[2]++) { if(check(num,2)) for(num[3] = 0; num[3] <=9; num[3]++) { if(check(num,3)) for(num[4] = 1; num[4] <=9; num[4]++) { if(check(num,4)) for(num[5] = 0; num[5] <=9; num[5]++) { if(check(num,5)) for(num[6] = 0; num[6] <=9; num[6]++) { if(check(num,6)) for(num[7] = 0; num[7] <=9; num[7]++) { if(check(num,7)) { int a = num[0]*1000+num[1]*100+num[2]*10+num[3]; int b = num[4]*1000+num[5]*100+num[6]*10+num[1]; int c = num[4]*10000+num[5]*1000+num[2]*100+num[1]*10+num[7]; if(a+b==c) { cout << b; } } } } } } } } }} return 0;}看了一下六十多行,啊,學這么多好累啊! 對于這種超過5個循環以上的暴力可以考慮用全排列函數 第二種方法如下:
#include<iostream>#include<algorithm>using namespace std;int main1(){ int num[10] = {1,0,2,3,4,5,6,7,8,9}; int count = 0; do { if(num[0]!=0&&num[4]!=0) { int a = num[0]*1000+num[1]*100+num[2]*10+num[3]; int b = num[4]*1000+num[5]*100+num[6]*10+num[1]; int c = num[4]*10000+num[5]*1000+num[2]*100+num[1]*10+num[7]; if(a+b==c) { cout << b; break; } } }while(next_permutation(num,num+10)); return 0;}這就簡便多了,這里注意到題目 答案唯一 所以當瞞住條件后就可以跳出循環,算法的時間就可以大大減少 自己總結了一下運用全排列的環境
五重循環以上數字不能重復要有順序新聞熱點
疑難解答