[藍橋杯] 方格填數
【題目描述 - 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 }