方格填数
如下的10个格子
±-±-±-+
| | | |
±-±-±-±-+
| | | | |
±-±-±-±-+
| | | |
±-±-±-+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include<bits/stdc++.h>
using namespace std;
int dir[8][2]={1,0,0,1,-1,0,0,-1,1,1,-1,-1,1,-1,-1,1};
int mapp[20][20];
bool judge(int x,int y)
{
int flag2=1;
int t1=mapp[x][y]-1;
int t2=mapp[x][y]+1;
for(int i=0;i<8;i++)
{
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(mapp[dx][dy]==t1||mapp[dx][dy]==t2)
return 1;
}
if(flag2==1)
return 0;
else
return 0;
}
int main()
{
int a[15];
int ans=0;
int flag;
for(int i=0;i<10;i++)
a[i]=i;
memset(mapp,0x3f,sizeof(mapp));
do
{
flag=1;
int i=0;
for(int j=2;j<=4;j++)
{
mapp[1][j]=a[i++];
}
for(int j=1;j<=4;j++)
{
mapp[2][j]=a[i++];
}
for(int j=1;j<=3;j++)
{
mapp[3][j]=a[i++];
}
for(int j=2;j<=4;j++)
{
if(judge(1,j))
flag=0;
}
for(int j=1;j<=4;j++)
{
if(judge(2,j))
flag=0;
}
for(int j=1;j<=3;j++)
{
if(judge(3,j))
flag=0;
}
if(flag==1)
ans++;
}while(next_permutation(a,a+10));
cout << ans << endl;
return 0;
}