方格填数
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案:1580
#include"iostream"
#include"algorithm"
#include"string.h"
#include"cstdio"
using namespace std;
int bi[3][4];
int sum=0;
bool sign[10];
bool check(int a,int b)
{
if(a<0||a>=3||b<0||b>=4||(a==0&&b==0)||(a==2&&b==3))
return false;
return true;
}
bool panduan(int a,int b)
{
bool sign=true;
for(int i=-1;i<=1;i++)
{
for(int j=-1;j<=1;j++)
{
if(i==0&&j==0)
continue;
int x=a+i;
int y=b+j;
if(check(x,y))
{
//cout<<"1";
if(bi[x][y]-bi[a][b]==1||bi[x][y]-bi[a][b]==-1)
return false;
}
}
}
return true;
}
void dfs(int a,int b)
{
if(a==2&&b==3)
{
sum++;
return;
}
//cout<<sum++;
for(int i=0;i<10;i++)
{
if(sign[i])
continue;
bi[a][b]=i;
if(panduan(a,b))
{
sign[i]=true;
dfs(a+(b+1)/4,(b+1)%4);
sign[i]=false;
}
bi[a][b]=-10;
}
}
int main()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
bi[i][j]=-10;
}
}
memset(sign,0,sizeof(sign));
dfs(0,1);
cout<<sum<<endl;
return 0;
}
类似于八皇后问题 ,只是判断的方法不一样而已