如下的十个格子:
有多少组填数方案?
答案:1580
题解:DFS
#include<bits/stdc++.h>
using namespace std;
int judge[3][4];
int a[3][4];
long long sum=0;
bool shu[10];
void DFS(int x,int y,int value)
{
a[x][y]=value;
shu[value]=1;
if(x==0&&y>1&&(a[x][y-1]-a[x][y]==1||a[x][y-1]-a[x][y]==-1))
return;
if(x==1&&y>0&&(a[x][y-1]-a[x][y]==1||a[x][y-1]-a[x][y]==-1||a[x-1][y]-a[x][y]==1||a[x-1][y]-a[x][y]==-1))
return;
if(x==2&&y==0&&(a[x-1][y]-a[x][y]==1||a[x-1][y]-a[x][y]==-1))
return;
if(x==2&&y>0&&(a[x][y-1]-a[x][y]==1||a[x][y-1]-a[x][y]==-1||a[x-1][y]-a[x][y]==1||a[x-1][y]-a[x][y]==-1))
return;
if(x>=1&&y!=3&&((a[x][y]-a[x-1][y+1]==-1)||a[x][y]-a[x-1][y+1]==1))
return;
if(x==1&&y>1&&((a[x][y]-a[x-1][y-1]==-1)||a[x][y]-a[x-1][y-1]==1))
return;
if(x==2&&y>0&&((a[x][y]-a[x-1][y-1]==-1)||a[x][y]-a[x-1][y-1]==1))
return;
if(x==2&&y==2)
{
sum++;
return;
}
if(x>=0&&x<=2&&y>=0&&y<=3&&!judge[x][y])
{
for(int i=0;i<=9;++i)
{
if(shu[i])
continue;
if(y==3)
DFS(x+1,0,i);
else
DFS(x,y+1,i);
shu[i]=0;
}
}
return;
}
int main()
{
memset(shu,0,sizeof(shu));
memset(judge,0,sizeof(judge));
judge[2][3]=1;
for(int i=0;i<=9;i++)
{
DFS(0,1,i);
shu[i]=0;
}
cout<<sum<<endl;
return 0;
}
|
|
|
|
+--+--+--+
(如果显示有问题,也可以参看【图
1.jpg
】
)
填入
0~9
的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字