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