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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

坑爹的奥数——枚举

發布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 坑爹的奥数——枚举 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、問題引入

小明在數學課上遇到一道奧數題是這樣的,【】3*6528=3【】*8256,在兩個【】內填入相同的數字使得等式成立。

不用分析了,直接show代碼:

for(int i=1;i<=9;i++)if((i*10+3)*6528==(30+i)*8256)printf("%d",i); //答案為4

?

這就是最簡單的枚舉算法。

枚舉算法的基本思想是:有序地去嘗試每一種可能。

?

二、問題拓展

現在小明又遇到一個稍微復雜一點的奧數題,【】【】【】+【】【】【】=【】【】【】,將數字1~9分別填入9個【】中,每個數字智能使用一次使得等式成立。

分析:根據枚舉思想我們只需要枚舉每一位上所有可能的數就好了。

int a,b,c,d,e,f,g,h,i,total=0;for(a=1;a<=9;a++) //第1個數的百位for(b=1;b<=9;b++) //第1個數的十位for(c=1;c<=9;c++) //第1個數的個位for(d=1;d<=9;d++) //第2個數的百位for(e=1;e<=9;e++) //第2個數的十位for(f=1;f<=9;f++) //第2個數的個位for(g=1;g<=9;g++) //第3個數的百位for(h=1;h<=9;h++) //第3個數的十位for(i=1;i<=9;i++) //第3個數的個位 { //接下來要判斷每一位上的數互不相等 if(a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && a!=h && a!=i&& b!=c && b!=d && b!=e && b!=f && b!=g && b!=h && b!=i&& c!=d && c!=e && c!=f && c!=g && c!=h && c!=i&& d!=e && d!=f && d!=g && d!=h && d!=i&& e!=f && e!=g && e!=h && e!=i&& f!=g && f!=h && f!=i&& g!=h && g!=i&& h!=i&& a*100+b*10+c+d*100+e*10+f==g*100+h*10+i){total++;printf("%d%d%d+%d%d%d=%d%d%d\n",a,b,c,d,e,f,g,h,i);}}printf("total=%d",total/2); //這是關鍵return 0;

?

注意:因為173+286=459與286+173=459是同一種組合,因此我們在輸出的時候需要將total的值除以2.

?

三、代碼優化

但是上述代碼中的if判斷條件似乎太長了,我這輩子估計都很難看到如此冗雜的判斷條件了...

所以我們用一個book數組來解決互不相等的問題:

int a[10],i,total=0,book[10],sum; //這里用a[1]-a[9]來代替剛才的a~ifor(a[1]=1;a[1]<=9;a[1]++)for(a[2];a[2]<=9;a[2]++)for(a[3];a[3]<=9;a[3]++)for(a[4];a[4]<=9;a[4]++)for(a[5];a[5]<=9;a[5]++)for(a[6];a[6]<=9;a[6]++)for(a[7];a[7]<=9;a[7]++)for(a[8];a[8]<=9;a[8]++)for(a[9];a[9]<=9;a[9]++){for(i=1;i<=9;i++) //初始化數組book[i]=0;for(i=1;i<=9;i++) //如果某個數出現過就標記一下book[a[i]]=1;sum=0;for(i=1;i<=9;i++)sum+=book[i]; //統計供出現了多少個不同的數 if(sum==9&&a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9]){total++;printf("%d%d%d+%d%d%d=%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);} }printf("total=%d",total/2);return 0;

上面這段代碼中,為了方便標記哪些數出現過,我將循環變量a、b、c、d、e、f、g、h、i用一個一維數組a代替,用book數組來標記1~9每個數是否出現過,默認為0,出現過的就設為1。然后我們只需要判斷book數組中有多少個1就可以了。如果恰好有9個1則表示,1~9每個數都有且只出現過一次。

?

四、篇外:dfs求解

#include<stdio.h> int a[10],book[10],total=0; void dfs(int step) //step表示現在站在第幾個盒子面前 {int i;if(step==10){if(a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9]){/*如果滿足要求,可行解+1,并打印這個解*/ total++;printf("%d%d%d+%d%d%d=%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);}return; //返回之前的一步(最近調用的地方) }/*站在第step個盒子面前,按照1、2、3...n的順序一一嘗試*/for(i=1;i<=9;i++){if(book[i]==0){a[step]=i;book[i]=1;dfs(step+1);book[i]=0;}} return; } int main() {dfs(1);printf("total=%d",total/2);return 0; } 奧數算式求解-dfs

?

總結

以上是生活随笔為你收集整理的坑爹的奥数——枚举的全部內容,希望文章能夠幫你解決所遇到的問題。

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