如下的10个格子
±-±-±-+
| | | |
±-±-±-±-+
| | | | |
±-±-±-±-+
| | | |
±-±-±-+
(如果显示有问题,也可以参看下图)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
暴力就完事了
#include"bits/stdc++.h"
int a[5][6];
int p[]={2,3,4,1,2,3,4,1,2,3},q[] = {1,1,1,2,2,2,2,3,3,3},ans,b[10];//a[]存每个位置的值,b[]存0~9是否出现过,p,q数组记住每个位置的地方
void dfs(int N)
{
if(N==10)
{
ans++;
//printf("%d",ans);
return;
}
for(int i = 0;i <= 9;i++)
{
if(b[i])continue;
int s = 0;
for(int m = -1;m <= 1;m++)
for(int n = -1;n <= 1;n++)
{
if(!(m==0&&n==0)&&abs(a[q[N]+n][m+p[N]]-i)!=1)
s++;
}
if(s==8)
{
a[q[N]][p[N]] = i;
b[i] = 1;
dfs(N+1);
b[i] = 0;
a[q[N]][p[N]] = 11;
}
}
}
int main()
{
memset(a,11,sizeof(a));//用11初始化,不怕无关位置的值的影响
for(int i = 0;i <= 9;i++)//第一个位置遍历0~9
{
a[q[0]][p[0]] = i;
b[i] = 1;
dfs(1);
b[i] = 0;//每次搜索后,将值还原
a[q[0]][p[0]] = 11;//同上
}
printf("%d",ans);
return 0;
}
ans = 1580