藍橋杯 方格分割


藍橋杯 方格分割

【題目描述 - Problem Description】

6x6的方格,沿着格子的邊線剪開成兩部分。

要求這兩部分的形狀完全相同。

 

  

如圖:p1.png, p2.png, p3.png 就是可行的分割法。

 

試計算: 包括這3種分法在內,一共有多少種不同的分割方法。

注意:旋轉對稱的屬於同一種分割法。

 

請提交該整數,不要填寫任何多余的內容或說明文字。

 

【題解】
  DFS暴力枚舉,和之前的剪郵票一個套路。由於需要考慮旋轉對稱造成的重復,最后結果除4。

  多注意剪枝,可以讓代碼快很多。

 

【最終結果】

509

 

【代碼 C++】

 1 #include <cstdio>
 2 struct Point {
 3     int y, x;
 4 }pit[36];
 5 int map[10][10], stk[18], opt;
 6 int sum(int y, int x) {
 7     if (map[y][x] == 1) {
 8         map[y][x] = 2;
 9         return 1 + sum(y + 1, x) + sum(y - 1, x) + sum(y, x + 1) + sum(y, x - 1);
10     }
11     return 0;
12 }
13 void DFS(int now, int i) {
14     if (i < 18) {
15         while (++now < 19 + i) {
16             if (map[7 - pit[now].y][7 - pit[now].x]) continue;
17             stk[i] = now;
18             map[pit[now].y][pit[now].x] = 1;
19             DFS(now, i + 1);
20             map[pit[now].y][pit[now].x] = 0;
21         }
22     }
23     else {
24         for (i = 0; i < 18; ++i) map[pit[stk[i]].y][pit[stk[i]].x] = 1;
25         if (sum(pit[stk[0]].y, pit[stk[0]].x) == 18) ++opt;
26     }
27 }
28 void init() {
29     int i, j, iPit = 0;
30     for (i = 1; i <= 6; ++i) for (j = 1; j <= 6; ++j) {
31         pit[iPit].y = i; pit[iPit].x = j;
32         ++iPit;
33     }
34 }
35 int main() {
36     init();
37     DFS(-1, 0);
38     printf("%d", opt >> 2);
39     return 0;
40 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM