[藍橋杯] 方格填數


[藍橋杯] 方格填數

【題目描述 - Problem Description】

  如圖,如下的10個格子,填入0~9的數字。要求:連續的兩個數字不能相鄰。


  (左右、上下、對角都算相鄰)一共有多少種可能的填數方案?
  請填寫表示方案數目的整數。

【題解】

  不知道是不是題目沒說清楚能不能重復,姑且當作不能重復吧(全排列大法好)
  暴力枚舉……

【最終結果】

1580

【代碼 C++】

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 int data[10], map[10][10], fx[8][2] = { 0, 1, 1, 0, 0, -1, -1, 0, 1, 1, 1, -1, -1, 1, -1, -1 };
 5 bool ts(int y, int x){
 6     int tmp1 = map[y][x] - 1, tmp2 = map[y][x] + 1, nxt, i;
 7     for (i = 0; i < 8; ++i){
 8         nxt = map[y + fx[i][0]][x + fx[i][1]];
 9         if (nxt == tmp1 || nxt == tmp2) return 1;
10     }
11     return 0;
12 }
13 int main() {
14     int i, j, opt = 0;
15     for (i = 0; i < 10; ++i) data[i] = i;
16     memset(map, 0x7F, sizeof map);
17     do{
18         for (i = 0, j = 2; i < 3; ++i, ++j) map[1][j] = data[i];
19         for (j = 1; j <= 4; ++i, ++j) map[2][j] = data[i];
20         for (j = 1; j <= 4; ++i, ++j) map[3][j] = data[i];
21 
22         for (i = 2; i <= 4; ++i) if (ts(1, i)) goto ed;
23         for (i = 1; i <= 4; ++i) if (ts(2, i)) goto ed;
24         for (i = 1; i <= 3; ++i) if (ts(3, i)) goto ed;
25         ++opt;
26     ed:;
27     } while (std::next_permutation(data, data + 10));
28     printf("%d", opt);
29     return 0;
30 }

 


免責聲明!

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



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