蓝桥杯第七届个人赛方格填数

来源:互联网 发布:ssh的端口号 编辑:程序博客网 时间:2024/06/07 17:33

方格填数

如下的10个格子

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

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

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

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

#include<stdio.h>#include<string.h>int visit[10]; int a[3][4];//矩阵3行4列 int map[3][4];//填数 int ans=0;//计数  void judge() { int dir[8][2]= {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}}; //8个方向向量  int i,j,k,x,y; int flag=1; for(i=0;i<3;i++) for(j=0;j<4;j++) { if(a[i][j]==0) continue; for(k=0;k<8;k++) { x=i+dir[k][0]; y=j+dir[k][1]; if(x < 0||x > 2||y<0||y>3||a[x][y]==0) continue; if(map[i][j]-map[x][y]==1) flag=0; }  }if(flag!=0)ans++;return; } //深搜  void dfs(int n) { int i,x,y; x=n/4;//获得所在行  y=n%4;//获得所在列   if(x==2&&y==3) judge();if(a[x][y]!=0) //如果当前位置可填入数字for(i=0;i<10;i++){if(visit[i]==0){visit[i]=1;map[x][y]=i;dfs(n+1);visit[i]=0;} }  else//当前位置不可填  dfs(n+1);return;  }  int main() {   memset(map,0,sizeof(map));memset(visit,0,sizeof(visit));memset(a,1,sizeof(a)); a[0][0]=0;   a[2][3]=0;dfs(0);printf("%d\n",ans);return 0; }
答案:1580

0 0
原创粉丝点击