搭積木 小明最近喜歡搭數字積木,
一共有10塊積木,每個積木上有一個數字,0~9。
搭積木規則:
每個積木放到其它兩個積木的上面,并且一定比下面的兩個積木數字小。
最后搭成4層的金字塔形,必須用完所有的積木。
下面是兩種合格的搭法:
0 1 2 3 4 5 6 7 8 9
0 3 1 7 5 2 9 8 6 4 請你計算這樣的搭法一共有多少種?
請填表示總數目的數字。 注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。
答案 (5分)
#include<stdio.h>#include<stdlib.h>int visited[10]={0}; //查看該元素是否被訪問int a[10] = {0,1,2,3,4,5,6,7,8,9};int sum = 0; //定義全局變量sum來進行對符合條件的組合計數int test(int n){ //對不適合的進行剪枝 if(n == 2){ if(a[0]<a[1]&&a[0]<a[2]){ return 1; } return 0; } else if(n == 5){ if(a[1]<a[3]&&a[1]<a[4]&&a[2]<a[4]&&a[2]<a[5]){ return 1; } return 0; } else if(n == 9){ if(a[3]<a[6]&&a[3]<a[7]&&a[4]<a[7]&&a[4]<a[8]&&a[5]<a[8]&&a[5]<a[9]){ sum++; return 1; } return 0; } else return 1;}void dfs(int n){ int i; for(i=0;i<10;i++){ if(!visited[i]){ visited[i]=1; a[n]=i; //除了以下三行判斷是否滿足搭積木的規則 //,其余就是標準的dfs(); if(!test(n)){ visited[i]=0; continue; } dfs(n+1); visited[i]=0; } }}int main(){ dfs(0); 寒假作業現在小學的數學題目也不是那么好玩的。
看看這個寒假作業:
□ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ (如果顯示不出來,可以參見【圖1.jpg】)
每個方塊代表1~13中的某一個數字,但不能重復。
比如:
6 + 7 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5 以及:
7 + 6 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5 就算兩種解法。(加法,乘法交換律后算不同的方案)
你一共找到了多少種方案?
請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。
答案 (8分)
#include<iostream> //包含memset(數組名,0/-1(只能是將數組中所有元素初始化這兩個數),sizeof(數組名)) //算法頭文件,其中包含許多好用的庫函數using namespace std;int a[120],book[20]={0},sum=0; //book數組是用來標記1-13哪個數已經被用過了,用過則記為1,否則記為0;void dfs(int x){ if(x>3&&a[1]+a[2]!=a[3]) //如果前三個數已經被取出來但不符合題設條件,則返回重找 return; if(x>6&&a[4]-a[5]!=a[6]) //若前三個數滿足第一條,看4-6個數是否滿足第二個條件 return; if(x>9&&a[7]*a[8]!=a[9]) //同上 return; if(x>12&&a[12]*a[11]==a[10]) //如果所有條件均滿足,則讓sum++ { sum++; return; } for(int i=1;i<14;i++) //將1-13放入每一個格子中 { if(book[i]==0) //若該數字沒被用過則可以用,進入下一步 { a[x]=i; book[i]=1; dfs(x+1); book[i]=0; } } return;}int main(){ dfs(1); cout<<sum; return 0;}新聞熱點
疑難解答