16行代码AC_蓝桥杯 2017年C组第三题 算式900(暴力解法+DFS解法)
生活随笔
收集整理的這篇文章主要介紹了
16行代码AC_蓝桥杯 2017年C组第三题 算式900(暴力解法+DFS解法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
勵志用更少的代碼做更高效的表達
題目描述:
小明的作業本上有道思考題:
看下面的算式:
(□□□□-□□□□)*□□=900
其中的小方塊代表0~9的數字,這10個方塊剛好包含了0~9中的所有數字。
注意:0不能作為某個數字的首位。
小明經過幾天的努力,終于做出了答案!如下:
(5012-4987)*36=900
用計算機搜索后,發現還有另外一個解,本題的任務就是:請你算出這另外的一個解。
解法一:全排列
這是一道非常經典的全排列類型題!這是一道非常經典的全排列類型題!!這是一道非常經典的全排列類型題!!!
幾種分析思路
1 使用多重for循環+判斷。 代碼量大,且容易出錯,10個元素之間互相判定不重復非常非常復雜。 放棄。
2 使用全排列函數。 具體函數的使用方法見博客:傳送門
使用全排列函數可以讓我們擁有各個位數不相等的十個數字的所有組合! 因此我們只需判斷0是否在第一位即可!
代碼展示
#include<bits/stdc++.h> using namespace std; int main() {int a[10] = {0,1,2,3,4,5,6,7,8,9};int num = 0;do{if(a[0]!=0 && a[4]!=0 && a[8]!=0) {int x1 = a[0]*1000+a[1]*100+a[2]*10+a[3];int x2 = a[4]*1000+a[5]*100+a[6]*10+a[7];int x3 = a[8]*10+a[9];if((x1-x2)*x3==900)printf("(%d-%d)*%d=900\n", x1, x2, x3);}}while(next_permutation(a, a+10));cout << num; return 0; }解法二:DFS
本題也可以使用DFS解題, 但并不是叫我們在考場中使用DFS,而是讓初學者利用這道簡單的題,加深對DFS使用的熟練程度。 (大佬請自動忽略)
DFS沒啥好說的,就是模板 。 直接上代碼
#include<bits/stdc++.h> using namespace std; int a[10]; int vis[10]; void dfs(int step) {if(step == 10) {if(a[0]!=0 && a[4]!=0 && a[8]!=0) {int x1 = a[0]*1000 + a[1]*100 + a[2]*10 + a[3];int x2 = a[4]*1000 + a[5]*100 + a[6]*10 + a[7];int x3 = a[8]*10 +a[9];if((x1-x2)*x3==900) printf("(%d-%d)*%d=900\n", x1, x2, x3);}} else for(int i = 0; i < 10; i++) if(!vis[i]) {vis[i] = 1;a[step] = i;dfs(step+1);vis[i] = 0;} }int main() {dfs(0); return 0; }總結與思考
1 藍橋杯的絕大多數題素有搜索與暴力杯之稱,因此對于本題羅列的兩種解法:全排列(暴力法)和dfs(搜索法),一定要牢牢掌握!每年真題都有涉及!
2 最重要的一點,我們的目的是解題, 不是炫技! 實用才是王道!
總結
以上是生活随笔為你收集整理的16行代码AC_蓝桥杯 2017年C组第三题 算式900(暴力解法+DFS解法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【已解决】scanf语句中%d后面多加一
- 下一篇: 21行代码AC_【蓝桥杯】承压计算(解题