| 
            
            
             
              【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; }              
             |