蓝桥杯方格填数

来源:互联网 发布:汉朝武将官职品级知乎 编辑:程序博客网 时间:2024/05/06 09:23
方格填数

如下的10个格子

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

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

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

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



用深搜的方法先把每个格子放的数字的全排列算出,然后判断哪些是满足题目要求的。
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>using namespace std;int flag[3][4];//表示格子能否放数字 int map[3][4];//每个格子放的数字bool visited[10];//深搜标志数组int ans=0;void init()//初始化格子{for(int i=0;i<3;i++){for(int j=0;j<4;j++)flag[i][j]=1;} flag[0][0]=0;flag[2][3]=0;} void solve(){bool kep=true;int dir[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};for(int i=0;i<3;i++){for(int j=0;j<4;j++){//判断相邻的两个数是否相连 if(!flag[i][j]) continue;for(int m=0;m<8;m++){int x=i+dir[m][0];int y=j+dir[m][1];if(x<0||x>=3||y<0||y>=4||flag[x][y]==0) continue;if(abs(map[x][y]-map[i][j])==1) kep=false;}}}if(kep)ans++;}void dfs(int index){int x,y;x=index/4;y=index%4;if(x==3){solve();return;}if(flag[x][y]){for(int k=0;k<10;k++){if(!visited[k]){visited[k]=true;map[x][y]=k;dfs(index+1);visited[k]=false;}}}elsedfs(index+1);}int main(){init();dfs(0);cout<<ans<<endl;return 0;} 


0 0
原创粉丝点击