藍橋杯 方格分割
【題目描述 - 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 }