蓝桥杯2016:方格填数

来源:互联网 发布:我知我师我爱我师ppt 编辑:程序博客网 时间:2024/05/01 00:24


方格填数


如下的10个格子
   +--+--+--+
   |  |  |  |
+--+--+--+--+
|  |  |  |  |
+--+--+--+--+
|  |  |  |
+--+--+--+


(如果显示有问题,也可以参看【图1.jpg】)


填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)


一共有多少种可能的填数方案?


请填写表示方案数目的整数。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。



#include<iostream>
using namespace std;
int vis[10]={0};
int b[10]={0};
int d[4][2]={0,-1,-1,-1,-1,0,-1,1};
int mat[3][4];
int sum=0;
int check(){
int sum=0; 
for(int i=0;i<3;i++)
for(int j=0;j<4;j++){
for(int k=0;k<4;k++){
int nx=i+d[k][0];
int ny=j+d[k][1];
if(nx>=0&&nx<=2&&ny>=0&&ny<=3)//在矩阵内才进行判断 
if(mat[i][j]==mat[nx][ny]+1||mat[i][j]==mat[nx][ny]-1){
return false;
}
}
}
return true;
}
int dfs(int num){
if(num==10){
int m=0;
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
if(i==0&&j==0||i==2&&j==3)continue;
mat[i][j]=b[m++]; 

}
int k=0;

if(check()==true)sum++;
return 0;
}
for(int i=0;i<10;i++){
if(vis[i]==0){
vis[i]=1;
b[num]=i;
dfs(num+1);
vis[i]=0;
}
}
}
int main(){
int num=0;
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
mat[i][j]=111;
dfs(num);
cout<<sum<<endl;
return 0;
}




0 0
原创粉丝点击