16行代码AC_蓝桥杯 2017年C组第三题 算式900(暴力解法+DFS解法)
勵(lì)志用更少的代碼做更高效的表達(dá)
題目描述:
小明的作業(yè)本上有道思考題:
看下面的算式:
(□□□□-□□□□)*□□=900
其中的小方塊代表0~9的數(shù)字,這10個(gè)方塊剛好包含了0~9中的所有數(shù)字。
注意:0不能作為某個(gè)數(shù)字的首位。
小明經(jīng)過幾天的努力,終于做出了答案!如下:
(5012-4987)*36=900
用計(jì)算機(jī)搜索后,發(fā)現(xiàn)還有另外一個(gè)解,本題的任務(wù)就是:請你算出這另外的一個(gè)解。
解法一:全排列
這是一道非常經(jīng)典的全排列類型題!這是一道非常經(jīng)典的全排列類型題!!這是一道非常經(jīng)典的全排列類型題!!!
幾種分析思路
1 使用多重for循環(huán)+判斷。 代碼量大,且容易出錯(cuò),10個(gè)元素之間互相判定不重復(fù)非常非常復(fù)雜。 放棄。
2 使用全排列函數(shù)。 具體函數(shù)的使用方法見博客:傳送門
使用全排列函數(shù)可以讓我們擁有各個(gè)位數(shù)不相等的十個(gè)數(shù)字的所有組合! 因此我們只需判斷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,而是讓初學(xué)者利用這道簡單的題,加深對DFS使用的熟練程度。 (大佬請自動(dòng)忽略)
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; }總結(jié)與思考
1 藍(lán)橋杯的絕大多數(shù)題素有搜索與暴力杯之稱,因此對于本題羅列的兩種解法:全排列(暴力法)和dfs(搜索法),一定要牢牢掌握!每年真題都有涉及!
2 最重要的一點(diǎn),我們的目的是解題, 不是炫技! 實(shí)用才是王道!
總結(jié)
以上是生活随笔為你收集整理的16行代码AC_蓝桥杯 2017年C组第三题 算式900(暴力解法+DFS解法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【已解决】scanf语句中%d后面多加一
- 下一篇: 21行代码AC_【蓝桥杯】承压计算(解题