Problem Description
如下的10个格子
(图形见QQ群)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
(图形见QQ群)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
Input
无
Output
输出一个整数
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
int a[3][4];
int used[10]={0};
int dir[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,1},{-1,1},{1,-1}};
int sum=0;
bool judge(){
int i,j,k;
int m,n;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
for(k=0;k<8;k++){
m=i+dir[k][0];
n=j+dir[k][1];
if(m>=0&&n>=0&&m<3&&n<4){
if(abs(a[i][j]-a[m][n])==1)
return false;
}
}
}
}
return true;
}
void dfs(int x,int y){
int i;
if(x==2 && y==3){
if(judge()){
sum++;
return;
}
else
return;
}
else{
for(i=0;i<10;i++){
if(!used[i]){
int n,m;
if(y+1>=4){
a[x][y]=i;
used[i]=1;
dfs(x+1,0);
used[i]=0;
}
else{
a[x][y]=i;
used[i]=1;
dfs(x,y+1);
used[i]=0;
}
}
}
}
}
int main(){
memset(used,0,sizeof(used));
a[0][0]=100;
a[2][3]=100;
dfs(0,1);
cout<<sum;
return 0;
}
答案:1580