方格填数
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
暴力上代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int b[6][7];
int check(int x,int y)
{
if(fabs(b[x][y]-b[x-1][y])==1||fabs(b[x][y]-b[x-1][y-1])==1||fabs(b[x][y]-b[x-1][y+1])==1||fabs(b[x][y]-b[x][y-1])==1||fabs(b[x][y]-b[x+1][y])==1||fabs(b[x][y]-b[x+1][y-1])==1||fabs(b[x][y]-b[x+1][y+1])==1||fabs(b[x][y]-b[x][y+1])==1)return 0;
return 1;
}
int main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int ans=0,x=0;
for(int i=0;i<=5;i++)
{
for(int j=0;j<=6;j++)
{
b[i][j]=-2;
}
}
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(j==i)continue;
for(int k=0;k<10;k++)
{
if(k==i||k==j)continue;
for(int l=0;l<10;l++)
{
if(l==i||l==j||l==k)continue;
for(int m=0;m<10;m++)
{
if(m==i||m==j||m==k||m==l)continue;
for(int n=0;n<10;n++)
{
if(n==i||n==j||n==k||n==l||n==m)continue;
for(int o=0;o<10;o++)
{
if(o==i||o==j||o==k||o==l||o==m||o==n)continue;
for(int p=0;p<10;p++)
{
if(p==i||p==j||p==k||p==l||p==m||p==n||p==o)continue;
for(int q=0;q<10;q++)
{
if(q==i||q==j||q==k||q==l||q==m||q==n||q==o||q==p)continue;
for(int r=0;r<10;r++)
{
if(r==i||r==j||r==k||r==l||r==m||r==n||r==o||r==p||r==q)continue;
b[1][2]=a[i];
b[1][3]=a[j];
b[1][4]=a[k];
b[2][1]=a[l];
b[2][2]=a[m];
b[2][3]=a[n];
b[2][4]=a[o];
b[3][1]=a[p];
b[3][2]=a[q];
b[3][3]=a[r];
for(int c=1;c<=3;c++)
{
int d=0,num=0;
if(c==1)d++;
for(;d<=4;d++)
{/*cout<<x++<<" "<<ans<<endl;*/
if(c==3&&d==4)
{
ans++;
break;
}
if(check(c,d))continue;
else{
num=1;
break;
}
}
if(num==1)break;
}
}
}
}
}
}
}
}
}
}
}
cout<<ans<<endl;
return 0;
}
答案得1580