蓝桥杯2017初赛-9数算式-dfs
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯2017初赛-9数算式-dfs
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述
觀察如下的算式:9213 x 85674 = 789314562
左邊的乘數(shù)和被乘數(shù)正好用到了1~9的所有數(shù)字,每個1次。
而乘積恰好也是用到了1~9的所有數(shù)字,并且每個1次。
請你借助計算機的強大計算能力,找出滿足如上要求的9數(shù)算式一共有多少個?
注意:
1. 總數(shù)目包含題目給出的那個示例。
2. 乘數(shù)和被乘數(shù)交換后作為同一方案來看待。
輸出
輸出一個整數(shù)表示答案
代碼如下:
#include <iostream> using namespace std; const int N = 12; bool vis[N]; int ans = 0; int book[N];bool check2() {for (int i = 1; i <= 9; i++) {if (book[i] != 1) {for (int i = 1; i <= 9; i++) {book[i] = 0;}return false;}}for (int i = 1; i <= 9; i++) {book[i] = 0;//這一步容易忽略,就因為忽略了這個,耽誤了我30分鐘........}return true; }bool check(int suma, int sumc) {long long sum = (long long)suma * sumc;while (sum) {book[sum % 10]++;sum = sum / 10;}if (check2()) {return true;}return false; }void dfs_c(int u, int suma, int sumc) {if (u > 9) {return;}if (check(suma, sumc) && sumc != 0) {ans++;}for (int i = 1; i <= 9; i++) {if (!vis[i]) {vis[i] = true;dfs_c(u + 1, suma, sumc * 10 + i);vis[i] = false;}} }void dfs_a(int u, int suma) {dfs_c(u, suma, 0);for (int i = 1; i <= 9; i++) {if (!vis[i]) {vis[i] = true;dfs_a(u + 1, suma * 10 + i);vis[i] = false;}} }int main() {dfs_a(0, 0);cout << ans / 2 << endl;//乘數(shù)和被乘數(shù)交換后作為同一方案來看待,所以要除2return 0; } #include <iostream> using namespace std; typedef long long LL; const int N = 15; bool vis[N]; int ans;bool check_2(LL sumb) {bool st[N];for (int i = 1; i <= 9; i++) {st[i] = 0;}while (sumb) {st[sumb % 10] = true;sumb = sumb / 10;}bool flag = false;for (int i = 1; i <= 9; i++) {if (!st[i]) {return false;}}return true; }bool check_1(int suma, int sumc) {LL sumb = (LL)suma * sumc;if (check_2(sumb)) {return true;}return false; }void dfs_c(int u, int suma, int sumc) {if (u > 9) {return ;}if (check_1(suma, sumc) ) {ans++;return ;}for (int i = 1; i <= 9; i++) {if (!vis[i]) {vis[i] = true;dfs_c(u + 1, suma, sumc * 10 + i);vis[i] = false;}} }void dfs_a(int u, int suma) {dfs_c(u, suma, 0);for (int i = 1; i <= 9; i++) {if (!vis[i]) {vis[i] = true;dfs_a(u + 1, suma * 10 + i);vis[i] = false;}} }int main() {dfs_a(0, 0);cout << ans / 2 << endl;return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的蓝桥杯2017初赛-9数算式-dfs的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯2017初赛-正则问题
- 下一篇: 白薯的功效与作用、禁忌和食用方法