如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=10;
int b[3][4];
int a[N]={0,1,2,3,4,5,6,7,8,9};
int vi[8][2]={{-1,0},{1,0},{0,-1},{0,1},{1,1},{-1,-1},{1,-1},{-1,1}};//相邻八个方格
int ans=0;
bool check(){
b[0][0]=-2;
b[2][3]=-2;
int p=0;
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
if(b[i][j]!=-2)
b[i][j]=a[p++];
}
}
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
for(int v=0;v<8;v++){
int x=i+vi[v][0];
int y=j+vi[v][1];
if(x>=0&&x<3&&y>=0&&y<4){
if(abs(b[x][y]-b[i][j])==1){
return false;
}
}
}
}
}
return true;
}
int main ()
{
do{
if(check()){
ans++;
}
} while(next_permutation(a,a+10));
printf("%d\n",ans);
return 0;
}