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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 4403 A very hard Aoshu problem DFS

發布時間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 4403 A very hard Aoshu problem DFS 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

problem statement

這道題給我們一個不超過15位的整數 讓我們在其中加等號或者加號
如果加完符號后符合計算結果 那么計數 最后輸出所有的情況

problem analysis

這道題其實就是想辦法遍歷所有情況
把合法的記錄下來 最終輸出就得到解
如何枚舉呢
我們可以枚舉等號的位置 等號左邊dfs一下 等號右邊dfs一下
最后最后看兩遍結果是否一樣 一樣就記錄++
最后左右兩遍可以搞兩個dfs
如何dfs 就是枚舉加號的位置把每一種情況都遍歷到就好了

problem code

#include<bits/stdc++.h> using namespace std; char a[20]; int num[20][20],len,ans; void rdfs(int lsum,int pos,int rsum){if(pos == len){// 如果走完了所有的數 那么判斷左是否等于右 如果等于 就記錄結果if(lsum==rsum)ans++;return;}for(int i=pos;i<len;i++){rdfs(lsum,i+1,rsum+num[pos][i]); //這就相同與ldfs} } void ldfs(int k,int mid,int lsum){//k表示當前位置 mid表示等號位置 lsum記錄左邊的和 if(k==mid){// 如果當前位置到mid 我們就搜索右邊的和 rdfs(lsum,mid,0);}for(int i=k;i<mid;i++){ldfs(i+1,mid,lsum+num[k][i]);// 這里就會把所有的加號情況遍歷 對每一個位置 下一個加號在k到mid的任何位置都會嘗試一遍 也就是對于當前位置 下一個加號的位置都搜索一遍 可以枚舉到所有的加號情況 }//左半部分枚舉加號  } int main() {while(scanf("%s",a)){len = strlen(a);if(strcmp(a,"END")==0)break;for(int i=0;i<len;i++){for(int j=0;j<len;j++){int sum=0;for(int k=i;k<=j;k++)sum = sum*10+(a[k]-'0');//預處理把任意i到j的數的大小求出來num[i][j] = sum;}}for(int i=1;i<len;i++)ldfs(0,i,0);printf("%d\n",ans);ans=0;}return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的HDU 4403 A very hard Aoshu problem DFS的全部內容,希望文章能夠幫你解決所遇到的問題。

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