如下的10个格子
填入0~9的数字。
要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include<iostream>
#include<cmath>
using namespace std;
int a[10], ans = 0;
/*暴力检查*/
bool check()
{
if (abs(a[0] - a[1]) == 1 ||
abs(a[0] - a[3]) == 1 ||
abs(a[0] - a[4]) == 1 ||
abs(a[0] - a[5]) == 1 ||
abs(a[1] - a[2]) == 1 ||
abs(a[1] - a[4]) == 1 ||
abs(a[1] - a[5]) == 1 ||
abs(a[1] - a[6]) == 1 ||
abs(a[2] - a[5]) == 1 ||
abs(a[2] - a[6]) == 1 ||
abs(a[3] - a[4]) == 1 ||
abs(a[3] - a[7]) == 1 ||
abs(a[3] - a[8]) == 1 ||
abs(a[4] - a[5]) == 1 ||
abs(a[4] - a[7]) == 1 ||
abs(a[4] - a[8]) == 1 ||
abs(a[4] - a[9]) == 1 ||
abs(a[5] - a[6]) == 1 ||
abs(a[5] - a[8]) == 1 ||
abs(a[5] - a[9]) == 1 ||
abs(a[6] - a[9]) == 1 ||
abs(a[7] - a[8]) == 1 ||
abs(a[8] - a[9]) == 1)
return false;
return true;
}
void solve(int k)
{
int t, i;
if (k == 10)
{
bool b = check();
if (b)
{
ans++;
}
return;
}
/*相当于生成全排列*/
else if (k < 10)
{
for (i = k; i < 10; ++i)
{
/*尝试交换a[i]和a[k]的数值*/
t = a[i];
a[i] = a[k];
a[k] = t;
solve(k + 1);
/*回溯*/
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}
int main()
{
int i;
for (i = 0; i <= 9; ++i)
{
a[i] = i;
}
solve(0);
cout << ans << endl;
}
来源:CSDN
作者:不努力死不死心
链接:https://blog.csdn.net/m0_46070659/article/details/104852499