【C語言代碼】 #include <stdio.h>
#define A arr[0] #define B arr[1] #define C arr[2] #define D arr[3] #define E arr[4]
int arr[5]; // 原數組 int map[] = {-9999, 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}; // 原數與修正數的對應關係, 0沒有修正數對應 int dir[4] = {-1, -5, 1, 5}; // 修正數 + 方向 = 新修正數
// 判斷一個修正數是否在修正數組中 int in(int n) { int i; for (i = 0; i < 5; i++) { if (map[arr[i]] == n) return 1; } return 0; }
// 合法性判定: 至少有4個相鄰面的交線, 且每個塊至少有一個相鄰面的交線 int check(void) { int m, m_new; int i, j, k; int found;
int faces[4][2]; // 相鄰的面 int faces_num = 0; // 相鄰的面數
for (i = 0; i < 5; i++) // 掃描每個塊 { m = map[arr[i]]; // 當前塊的修正數 found = 0; // 當前塊與多少個方格相鄰 for (j = 0; j < 4; j++) // 掃描當前塊的四個方向 { m_new = m + dir[j]; // 該方向的修正數 if (in(m_new)) // 如果修正數在arr數組中, 表示兩方格相鄰 { found++;
if (faces_num < 4) // faces數組最多只能存4個相鄰面交線數據 { // 判斷該面交線是否已經存到了faces數組中 for (k = 0; k < faces_num; k++) { if ((faces[k][0] == m && faces[k][1] == m_new) || (faces[k][1] == m && faces[k][0] == m_new)) break; } // 如果沒有就添加進去, 然後把faces_num的值+1 if (k == faces_num) // 循環不是因為break結束 { // 大小順序不定 faces[faces_num][0] = m; faces[faces_num][1] = m_new; faces_num++; } } } } if (found == 0) return 0; // 每個塊至少有一個相鄰的面 } return (faces_num >= 4); }
int main(void) { int cnt = 0;
// 生成C5_12組合的簡易方法 for (A = 1; A <= 12; A++) { for (B = A + 1; B <= 12; B++) { for (C = B + 1; C <= 12; C++) { for (D = C + 1; D <= 12; D++) { for (E = D + 1; E <= 12; E++) { if (check()) { cnt++; printf("[%d] %d %d %d %d %d\n", cnt, A, B, C, D, E); } } } } } }
printf("總數: %d\n", cnt);
return 0; }
|