【DFS】排排坐
排排坐
題目大意:
有n個(gè)方塊,有一些是黑色,有一些是白色,可以點(diǎn)擊一個(gè)方塊使它和它旁邊的方塊反轉(zhuǎn)顏色(黑變白,白變黑),問最少要點(diǎn)多少次才能將方塊 們 變成目標(biāo)的方塊們,如果不行,輸出"Boring"
原題:
題目描述
小B喜歡在藍(lán)心網(wǎng)玩游戲,一天他玩到了這個(gè)游戲:他感覺非常好玩…于是他就YY出了一個(gè)類似的簡(jiǎn)易模型…
游戲規(guī)則:每次點(diǎn)擊一個(gè)小朋友,他和他的周圍的小朋友都會(huì)改變狀態(tài)(蹲下的變成了站起來(lái)的,站起來(lái)的變成了蹲下的)
我們將這個(gè)抽象成如下圖所示的1*N的圖.對(duì)于一個(gè)單元格,黑色表示小朋友是站起來(lái)的,反之,蹲下的小朋友是是白色的.Source表示初始狀態(tài),Target表示目標(biāo)狀態(tài).
現(xiàn)在小B有點(diǎn)偷懶,希望作為神牛的你幫小B算出初始狀態(tài)到目標(biāo)狀態(tài)的最少點(diǎn)擊數(shù).
輸入
第一行為N表示小朋友的個(gè)數(shù).
第二行是初始狀態(tài),有N個(gè)數(shù),每個(gè)數(shù)不是0就是1.(0表示小朋友是蹲下的,1表示小朋友是站起來(lái)的)
第三行的結(jié)構(gòu)跟第二行類似,表示目標(biāo)狀態(tài)
輸出
一個(gè)數(shù)X,表示初始狀態(tài)到目標(biāo)狀態(tài)的最少點(diǎn)擊數(shù)。
如果無(wú)法到達(dá)目標(biāo),則請(qǐng)輸出"Boring"
輸入樣例
9 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0輸出樣例
2只需要點(diǎn)擊第二個(gè)和第六個(gè)點(diǎn)即可。
說明
對(duì)于100%的數(shù)據(jù),N<=10
解題思路:
枚舉每一個(gè)方塊,看點(diǎn)不點(diǎn),就是O(2102^{10}210),然后判斷,求最小即可
代碼:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,t,ans,a[15],b[15]; void dfs(int dep,int now) {if (dep>n)//已完成{t=0;//清零for (int i=1;i<=n;++i)if (a[i]!=b[i]) t=1;//有一個(gè)不同就不行if (!t) ans=min(ans,now);//取最小值return;}if (now>=ans) return;a[dep-1]=(a[dep-1]+1)%2;//翻a[dep]=(a[dep]+1)%2;a[dep+1]=(a[dep+1]+1)%2;dfs(dep+1,now+1);a[dep-1]=(a[dep-1]+1)%2;//返回去a[dep]=(a[dep]+1)%2;a[dep+1]=(a[dep+1]+1)%2;dfs(dep+1,now); } int main() {scanf("%d",&n);for (int i=1;i<=n;++i)scanf("%d",&a[i]);for (int i=1;i<=n;++i)scanf("%d",&b[i]);ans=2147483647;dfs(1,0);printf("%d",ans);//輸出 }總結(jié)
- 上一篇: 【SPFA】【最短路/次短路】GF打Do
- 下一篇: 【DP】【递归】分离与合体