题目描述
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
分析:使用全排列枚举每个格子的数,之后利用DFS搜索每个格子附近的格子中的数是否与当前格子连续。这里对mp数组进行了处理,将mp数组全部元素赋值为-1,DFS搜索的时候如果当前格子值为-1,说明当前格子所在位置不合法,跳过该格子的判断。
#include<bits/stdc++.h>
using namespace std;
int mp[10][10];
int vis[15];
int dx[]={-1,1,0,0,-1,-1,1,1};
int dy[]={0,0,-1,1,1,-1,-1,1};
bool dfs(int x,int y)
{
for(int i = 0;i<8;i++)
{
int ax = x+dx[i];
int ay = y+dy[i];
if(mp[ax][ay]!=-1)
{
if(abs(mp[ax][ay]-mp[x][y])==1)
{
return false;
}
}
}
return true;
}
int main()
{
int arr[]={0,1,2,3,4,5,6,7,8,9};
memset(mp,-1,sizeof(mp));
long long ans = 0;
do
{
mp[1][2]=arr[0];
mp[1][3]=arr[1];
mp[1][4]=arr[2];
mp[2][1]=arr[3];
mp[2][2]=arr[4];
mp[2][3]=arr[5];
mp[2][4]=arr[6];
mp[3][1]=arr[7];
mp[3][2]=arr[8];
mp[3][3]=arr[9];
bool f=true;
for(int i = 1;i<=3;i++)
{
f = true;
for(int j=1;j<=4;j++)
{
if(mp[i][j]!=-1)
{
if(!dfs(i,j))
{
f=false;
break;
}
}
}
if(!f)
{
break;
}
}
if(f)
ans++;
}while(next_permutation(arr,arr+10));
cout<<ans<<endl;
}
答案:
1580