第八届蓝桥杯决赛 磁砖样式(枚举)
生活随笔
收集整理的這篇文章主要介紹了
第八届蓝桥杯决赛 磁砖样式(枚举)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
標(biāo)題:磁磚樣式
小明家的一面裝飾墻原來(lái)是 3*10 的小方格。
現(xiàn)在手頭有一批剛好能蓋住2個(gè)小方格的長(zhǎng)方形瓷磚。
瓷磚只有兩種顏色:黃色和橙色。
小明想知道,對(duì)于這么簡(jiǎn)陋的原料,可以貼出多少種不同的花樣來(lái)。
小明有個(gè)小小的強(qiáng)迫癥:忍受不了任何2?22*22?2的小格子是同一種顏色。
(瓷磚不能切割,不能重疊,也不能只鋪一部分。另外,只考慮組合圖案,請(qǐng)忽略瓷磚的拼縫)
顯然,對(duì)于 2?32*32?3個(gè)小格子來(lái)說(shuō),口算都可以知道:一共10種貼法,如【p1.png所示】
但對(duì)于3?103*103?10 的格子呢?肯定是個(gè)不小的數(shù)目,請(qǐng)你利用計(jì)算機(jī)的威力算出該數(shù)字。
注意:你需要提交的是一個(gè)整數(shù),不要填寫任何多余的內(nèi)容(比如:說(shuō)明性文字)
答案:101466
分析
- 對(duì)于這道題,我們只要枚舉出所以的磁磚鋪設(shè)情況,統(tǒng)計(jì)出滿足要求的情況個(gè)數(shù)就能解出這道題了。但是怎么枚舉,如何判斷是否滿足要求,如何記錄當(dāng)前滿足條件的鋪設(shè)情況。下面我們來(lái)解決這些問(wèn)題:
我們先規(guī)定一種鋪設(shè)方式:先一行一行地鋪,當(dāng)這當(dāng)前行鋪滿了,再去鋪下一行。磁磚可以橫向鋪設(shè),也可以豎向鋪設(shè),我們可以分開寫成兩個(gè)部分,根據(jù)當(dāng)前行剩余的空位來(lái)選擇橫向鋪設(shè)還是縱向鋪設(shè)。對(duì)于各個(gè)位置狀態(tài)的標(biāo)記,如果沒(méi)有鋪設(shè),該位置的狀態(tài)值為-1;如果鋪黃色,該位置的狀態(tài)值為0;如果橙色,該位置的狀態(tài)值為1。
只要任意2?22*22?2的小方格里面狀態(tài)值的和不為0和4就可以判斷為符合條件。
一共有30個(gè)位置,每個(gè)位置都只有兩種狀態(tài)(橙色或者黃色),我們可以用二進(jìn)制來(lái)進(jìn)行狀態(tài)記錄,然后把狀態(tài)值放進(jìn)一個(gè)集合中(集合中的元素不會(huì)重復(fù)),最后把集合的大小輸出即可得到花樣總數(shù)。
代碼如下
import java.util.*;public class Main {final static int r=3,c=10;static int a[][]=new int [r][c];static Set<Integer> set=new HashSet<>();static boolean check() {for(int i=0;i<r-1;i++)for(int j=0;j<c-1;j++)if((a[i][j]+a[i+1][j]+a[i][j+1]+a[i+1][j+1])%4==0)return false;return true;}static void dfs(int x,int y) {if(a[x][y]==-1) {//橫向鋪設(shè)if(y+1<c && a[x][y+1]==-1) {for(int i=0;i<2;i++) {a[x][y]=a[x][y+1]=i;if(y==c-1) {dfs(x+1, 0);}else {dfs(x, y+1);}a[x][y]=a[x][y+1]=-1;//backtracking}}//豎向鋪設(shè)if(x+1<r && a[x+1][y]==-1) {for(int i=0;i<2;i++) {a[x][y]=a[x+1][y]=i;if(y==c-1) {dfs(x+1, 0);}else {dfs(x, y+1);}a[x][y]=a[x+1][y]=-1;//backtracking}}}else {if(y==c-1 && x==r-1) {if(check()) {int res=0;for(int i=0;i<r;i++)for(int j=0;j<c;j++) res=(res<<1)+a[i][j];set.add(res);}return;}//if there is still space leftif(y==c-1) {dfs(x+1, 0);}else {dfs(x, y+1);}}}public static void main(String[] args) {for(int i=0;i<r;i++)Arrays.fill(a[i], -1);dfs(0, 0);System.out.println(set.size());} }總結(jié)
以上是生活随笔為你收集整理的第八届蓝桥杯决赛 磁砖样式(枚举)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第八届蓝桥杯决赛 平方十位数(枚举)
- 下一篇: 第八届蓝桥杯决赛 图书排列