蓝桥杯题目:方格填数
如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
//方格填数
#include<iostream>
using namespace std;
int sum=0;
int book[10];
int g[3][4]; //三行四列的数组
bool jdp(int x,int y){
//判断位置
if(x==0&&y==0||x==2&&y==3) return false; //特殊位置
if(x<0||x>2||y<0||y>3) return false; //超界位置
return true; //合法位置 if(x>=0&&x<=2&&y>=0&&y<=3)
}
bool judge(int x,int y,int n){
//判断在(x,y)位置放n是否可行
//依次判断八个相邻位置是否合法
if(jdp(x,y-1)==true)//左侧位置合法,则进行判断
if(g[x][y-1]==n-1||g[x][y-1]==n+1) return false;
if(jdp(x,y+1)==true)//右侧位置合法,则进行判断
if(g[x][y+1]==n-1||g[x][y+1]==n+1) return false;
if(jdp(x-1,y)==true)//上侧位置合法,则进行判断
if(g[x-1][y]==n-1||g[x-1][y]==n+1) return false;
if(jdp(x+1,y)==true)//下侧位置合法,则进行判断
if(g[x+1][y]==n-1||g[x+1][y]==n+1) return false;
if(jdp(x-1,y-1)==true)//左上侧位置合法,则进行判断
if(g[x-1][y-1]==n-1||g[x-1][y-1]==n+1) return false;
if(jdp(x+1,y-1)==true)//右上侧位置合法,则进行判断
if(g[x+1][y-1]==n-1||g[x+1][y-1]==n+1) return false;
if(jdp(x-1,y+1)==true)//侧左下位置合法,则进行判断
if(g[x-1][y+1]==n-1||g[x-1][y+1]==n+1) return false;
if(jdp(x+1,y+1)==true)//右下侧位置合法,则进行判断
if(g[x+1][y+1]==n-1||g[x+1][y+1]==n+1) return false;
return true;
}
void dfs(int x,int y){
//深度优先算法,依次填写每个格子
if(x==2&&y==3){
//到达递归终点
sum++;
return;
}
//未到终点,给当前点选一个数字
int i;
for(i=0;i<=9;i++)
if(book[i]==0&&judge(x,y,i)){
book[i]=1;
g[x][y]=i;
if(y<3)dfs(x,y+1);
else if(y==3)dfs(x+1,0);
g[x][y]=-100; //赋予一个特殊值
book[i]=0;
}
}
int main()
{
int i,j;
for(i=0;i<10;i++)book[i]=0; //book数组赋初值
for(i=0;i<3;i++) //给数组g赋初值
for(j=0;j<4;j++)g[i][j]=-100;
dfs(0,1);
cout<<sum<<endl;
return 0;
}
答案:1580