版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/belous_zxy/article/details/84351283
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
DFS
全排列,判断是否相邻。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
int matrix[5][6]={0};
bool book[10]={false};
int sum=0,x,y;
bool check(void)
{
const int goxy[9][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
for(int i=1;i<=3;i++)
{
for(int j=1;j<=4;j++)
{
if(i==1&&j==1||i==3&&j==4)
continue;
int temp1=matrix[i][j]-1;
int temp2=matrix[i][j]+1;
for(int k=0;k<9;k++)
{
int tx=i+goxy[k][0];
int ty=j+goxy[k][1];
if(matrix[tx][ty]==temp1||matrix[tx][ty]==temp2)
return false;
}
}
}
return true;
}
void DFS(int sp)
{
if(sp==11)
{
if(check())
sum++;
return;
}
for(int i=0;i<10;i++)
{
if(book[i])
continue;
book[i]=true;
matrix[x][y]=i;
if(y==4)
{
x++,y=1;
DFS(sp+1);
x--,y=4;
}
else
{
y++;
DFS(sp+1);
y--;
}
book[i]=false;
}
}
int main(int argc,char **argv)
{
x=1,y=2;
for(int i=0;i<5;i++)
for(int j=0;j<6;j++)
matrix[i][j]=1<<30;
DFS(1);
printf("%d\n",sum);
return EXIT_SUCCESS;
}