蓝桥杯第七届省赛第六题-方格填数(CSDN好像最简单的实现)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
在我看到这个题时,我发现这个题可以用DFS实现,分成10步,每步填入一个数,但是难点在于不相邻如何解决,我们以第二行第二个方格为例分析一下,我们会发现它所有的相邻方格以及它本身组成了一个33的正方形,那么怎么表示这样一个正方形?以一个34的二维数组来模拟这个方格我们会发现,这个正方形的四个边界可以用到这个方格本身到X和Y方向的的距离的绝对值<=1来表示。
代码
#include<iostream>
#include<math.h>
using namespace std;
int Map[3][4]={
0,1,1,1,1,1,1,1,1,1,1,0};
int vis[3][4];
int res=0;
void Dfs(int step,int x,int y){
if(step==9){
res++;
return;
}
for(int i=0;i<3;i++){
//这里本身就在遍历可以填数的其他位置,所以不用先找到其他位置,再逐一的遍历其上下左右,简化了许多
for(int j=0;j<4;j++){
if(abs(j-y)<=1 && abs(i-x)<=1)//两条x轴的平行线和y轴平行线相交组成的正方形里面的方格都不能填数
continue;
else{
if(Map[i][j]==1 && vis[i][j]==0){
vis[i][j]=1;
Dfs(step+1,i,j);
vis[i][j]=0;
}
}
}
}
}
int main(){
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
if(Map[i][j]==1){
vis[i][j]=1;
Dfs(0,i,j);
vis[i][j]=0;
}
}
}
cout<<res;
}
答案:1580