日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[蓝桥杯2018决赛]最大乘积-dfs

發布時間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [蓝桥杯2018决赛]最大乘积-dfs 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述
把 1~9 這9個數字分成兩組,中間插入乘號,
有的時候,它們的乘積也只包含1~9這9個數字,而且每個數字只出現1次。
比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925

符合這種規律的算式還有很多,請你計算在所有這些算式中,乘積最大是多少?
輸出
輸出一個整數表示答案

代碼如下:

#include <iostream> #include <cstring> using namespace std; typedef long long LL; LL maxv = -1; const int N = 12; bool vis[N]; bool st[N];bool check(int suma, int sumc) {LL b = (LL)suma * sumc;memset(vis, 0, sizeof(vis));//標記數組記得重置if (!b) {return false;}while (b) {if (vis[b % 10] || b % 10 == 0)return false;vis[b % 10] = true;b = b / 10;}for (int i = 1; i <= 9; i++) {if (!vis[i])return false;}return true; }void dfs_c(int u, int suma, int sumc) {//if (u > 9) {if (u >= 9) { //邊界不要弄錯if (check(suma, sumc)) {maxv = max((LL)suma * sumc, maxv);return ;}return ;}for (int i = 1; i <= 9; i++) {if (!st[i]) {st[i] = true;dfs_c(u + 1, suma, sumc * 10 + i);st[i] = false;}} }void dfs_a(int u, int suma) {if (u) {dfs_c(u, suma, 0);}for (int i = 1; i <= 9; i++) {if (!st[i]) {st[i] = true;dfs_a(u + 1, suma * 10 + i);st[i] = false;}} }int main() {dfs_a(0, 0);cout << maxv << endl;return 0; } #include <iostream> using namespace std; typedef long long LL; const int N = 12; bool vis[N]; LL maxv = -1;bool check_1(int suma,int sumc) {int st[N];memset(st,0,sizeof(st));//必不可少 // for (int i = 1;i<=9;i++)或者寫成這樣,反正無論怎么寫,都要初始化為0 // { // st[i] = 0 // }LL sumb = suma*(LL)sumc;while(sumb){st[sumb%10]++;sumb = sumb/10;}for (int i = 1;i<=9;i++){if (st[i]!=1)return false;}return true; }void dfs_c(int u,int suma,int sumc) {if (u > 9) return ;if (u==9){if (check_1(suma,sumc) && sumc!=0){LL sumb = (LL)suma*sumc;maxv = max(maxv,sumb);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<<maxv<<endl;return 0; }

總結

以上是生活随笔為你收集整理的[蓝桥杯2018决赛]最大乘积-dfs的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。