蓝桥杯第七届省赛第六题-方格填数(CSDN好像最简单的实现)DFS

蓝桥杯第七届省赛第六题-方格填数(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

猜你喜欢

转载自blog.csdn.net/weixin_46610759/article/details/108189935