如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
答案:1580
解题思路:通过next_permutation函数暴力枚举
#include<cstdio>
#include<math.h>
#include<algorithm>
using namespace std;
int main(void){
int a[] = {0,1,2,3,4,5,6,7,8,9};
int sum = 0;
do
{
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)
)
sum++;
}while(next_permutation(a,a+10));
printf("%d",sum);
}
解题思路:通过DFS,把方格补充为5*6的方格初值置为0,然后将2-11填入方格中,因为是从上到下,从左到右填入表格中所以每个方格只需要与左边以及上面三个方格中的数进行判断。
#include<cstdio>
#include<math.h>
int a[4][5] = {0};
int Y[4] = {-1,-1,0,1};
int X[4] = {0,-1,-1,-1};
int hashtable[10] = {0};
int num[10] = {2,3,4,5,6,7,8,9,10,11};
int sum = 0;
bool check(int i,int j)
{
for(int k = 0;k < 4;k++){
if(abs(a[i][j] - a[i + X[k]][j + Y[k]]) == 1)
return false;
}
return true;
}
void dfs(int i,int j)
{
if(i == 3&&j == 4)
{
sum++;
return;
}
for(int m = 0;m < 10;m++)
{
if(hashtable[m]==0)
{
a[i][j] = num[m];
if(check(i,j))
{
hashtable[m] = 1;
if(j == 4)
dfs(i+1,1);
else
dfs(i,j+1);
hashtable[m] = 0; //结束之后将占有的数返还
a[i][j] = 0;
}
}
}
}
int main(void)
{
dfs(1,2);
printf("%d",sum);
return 0;
}