题目描述
如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
输出格式
请填写表示方案数目的整数。
代码
#include <iostream>
#include <algorithm>
using namespace std;
int num[10] = { 0,1,2,3,4,5,6,7,8,9 };
int dx[8] = { 0, -1, 0, 1, -1, -1, 1, 1 };//偏移量
int dy[8] = { -1, 0, 1, 0, -1, 1, -1, 1 };//偏移量
int a[3][4];
int ans = 0;
bool check(int x, int y, int t) {
for (int i = 0; i < 8; i++) {
int m = x + dx[i], n = y + dy[i];
//判断是否越界
if (m < 0 || m >= 3 || n < 0 || n >= 4)
continue;
//判断相邻的数是否连续
if (abs(a[m][n] - t) == 1)
return false;
}
return true;
}
int main() {
do {
bool flag = true;
int n = 0;
for (int i = 0; i < 3; i++) { //二维数组填数
for (int j = 0; j < 4; j++) {
if (i == 0 && j == 0 || i == 2 && j == 3) {
a[i][j] = -2; //头尾两个位置空出
}
else {
a[i][j] = num[n++]; //其余位置连续填数
}
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
if (!check(i, j, a[i][j])) { //调用check函数判断相邻的数是否连续
flag = false;
break;
}
}
}
if (flag) {
ans++;
}
} while (next_permutation(num, num + 10)); //全排列
cout << ans << endl;
return 0;
}
答案
1580