講述來自:感謝作者
剪郵票如【圖1.jpg】, 有12張連在一起的12生肖的郵票。
現在你要從中剪下5張來,要求必須是連著的。
(僅僅連線乙個角不算相連)
比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。
請你計算,一共有多少種不同的剪取方法。
思路:先找到5個數的組合,然後從第乙個數字開始遍歷,經過上下左右操作檢測5個數是否都被訪問一遍,如果5個數都可以遍歷到則種類+1。
在原圖中向上為-4,向下為+4,向左為-1,向右為+1,但是遇到3 4 5 7 8這種4+1=5但是這種情況不符合,所以重構一下原圖:
這樣,向上為-5,向下為+5,向左為-1,向右為+1,避免了每行最後乙個+1後等於下一行第乙個的情況。
作者**:
#include using namespace std;
int mp[12]= ;
int aa[5],vis[5],sum=0;
int b[4]= ;
void dfs(int n)
} }
int main()
} if(flag==0) continue;
else
sum++;
} cout
int random[5];//存放隨機尋找到的5個數
int visit[5];//是否被訪問到的標記
//每個隨機取出來的數random[i]對應乙個visit[i],表示該數有沒有被遍歷過
int tag[4]=;//向右+1,向左-1,向下+5,向上-5
void dfs(int n) //n代表隨機數的下標random[n],這樣random[i]和visit[i]可以一一對應起來
} }} int main()
visit[0]=1; //從第乙個數出發,這個random[0]這個數已經被遍歷過了 visit[0]=1
dfs(0);//從第乙個數出發,開始找,看看能不能把其餘的 4個數random[1-4]都找到,進入函式dfs
//找完了,不知道五個數是否都能遍歷到,都能遍歷到即visit陣列的元素都是一,當然這種情況就可取
int flag=1;
for(i=0;i<5;i++) //看每乙個random是否都遍歷到了,如果是,就sum++,不是就繼續找下一批 5個隨機數重複過程
}if(!flag)continue;//這情況不行
else}}
}} }
printf("%d\n",sum);
}
2016 藍橋杯 剪郵票 dfs
這是2016年藍橋杯c語言省賽b組的第七題 題目 如下圖,有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,下面兩張圖中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。輸出 請填寫表示方案數目的整數。oj鏈結 思路 通過對...
藍橋杯2016初賽 剪郵票
題目描述 如下圖,有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,下面兩張圖中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。輸出請填寫表示方案數目的整數。思想 一看資料量應該就知道是乙個簡單的 dfs 或者 bfs 的...
藍橋杯 2016省賽 剪郵票
思路 一開始想到dfs套模板來用,可是發現像12346這種無法掃瞄到。從已經剪下來的任乙個點都可以開始dfs。這樣就不會漏掉情況 圖中的123456789101112數字沒有用處。在判斷重複的時候簡單的壓縮一下,2的13次方之內的即可儲存 include include using namespac...