蓝桥杯第七届第六题省赛题----方格填数Java,dfs

方格填数

如下的10个格子
在这里插入图片描述

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?

解题思路:深搜,从第一个位置开始,一行一行填,遇到不满足的返回上一步,直到十个位置都填满数,深搜一定要回溯。
public class Demo_7_06 {
	static int count=0;
	public static void main(String[] args)   {
		int[][] arr=new int[3][4];
		for(int i=0;i<3;i++) {
			for(int j=0;j<4;j++) {
				arr[i][j]=-3;
			}
		}
		dfs(arr,0);
		System.out.println(count);
	}
	public static void dfs(int[][] arr,int n) {
		//说明最后一个数也填进去了,总数加1
		if(n==10) {
			count++;
			return;
		}
		for(int i=0;i<3;i++) {
			for(int j=0;j<4;j++) {
				//去掉不满足题意的第一个和最后一个位置
				if(i==0&&j==0||i==2&&j==3)continue;
				if(check(arr,i,j,n)) {
					arr[i][j]=n;
					dfs(arr,n+1);
					//不满足条件一定要回溯
					arr[i][j]=-3;
				}
			}
		}
	}
	public static boolean check(int[][] arr,int x,int y,int n) {
		if(arr[x][y]!=-3)return false;
		for(int i=x-1;i<x+1;i++) {
			for(int j=y-1;j<y+1;j++) {
				//向左向有移动可能会越界,遇到直接跳过
				if(i==-1||i==3||j==-1||j==4)continue;
				//自己本身直接跳过
				if(i==x&&j==y)continue;
				//相邻的条件是上下左右都差一
				if(Math.abs(arr[i][j]-n)==1) {
					return false;
				}
			}
		}
		return true;
	}
}
输出:509538

猜你喜欢

转载自blog.csdn.net/qq_41765969/article/details/88689268