填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能填写的方案?
请填写表示方案数目的整数~
分析:从左到右从上到下标为0~9,将a[10]中的数字依次填入,所以只要将a数组从0123456789一直全排列试到9876543210,测试每一个结果是否满足,满足条件的次数累加得到的就是方案数目~答案是1580~
#include <iostream>
#include <algorithm>
using namespace std;
int a[10]={0,1,2,3,4,5,6,7,8,9};
bool p(int i,int j){
if(abs(a[i]-a[j])==1)return true;
else return false;
}
bool check(){
if(p(0,1)||p(0,4)||p(0,3)||p(0,5)||p(1,2)||p(1,5)||p(1,4)
||p(1,6)||p(2,5)||p(2,6)||p(3,4)||p(3,7)||p(3,8)||p(4,7)
||p(4,5)||p(4,8)||p(4,9)||p(5,6)||p(5,8)||p(5,9)||p(6,9)
||p(7,8)||p(8,9))return false;
return true;
}
int main()
{
int n=1;//n先是为1
for(int i=1;i<=10;i++)n*=i;//全排列总数
int cnt=0;
while(n--){
next_permutation(a,a+10);
if(check())cnt++;
}
cout<<cnt<<endl;
return 0;
}