方格填数 —— dfs

前提是你 提交于 2020-03-03 15:45:33

方格填数

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

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

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

//方格填数
public class Main{  
	static int cnt=0;
	static boolean []vis = new boolean[10]; //标记每个数是否被访问
	static int [][]table = new int[3][4];
	public static void main(String[] args)
	{
		for(int i = 0;i<3;i++){
			for(int j=0;j<4;j++){
				table[i][j] = -2;  //全部设置为-2
			}
		}
		
		for(int j=0;j<10;j++){
			vis[j] = false;
		}
		
		dfs(table,0,1);		
		System.out.print(cnt);
	}
	
		
	private static void dfs(int[][] table, int i, int j) {
		if(i==2 && j==3){
		    cnt++;
			return; 
		}

 		for(int t=0;t<10;t++){
			boolean flag = check(t,i,j);  //检查t是否可以填入
			if(flag == true && vis[t] == false) 
			{
				table[i][j] = t;
				vis[t] = true;
				dfs(table,i+(j+1)/4,(j+1)%4);
				table[i][j] = -2;
				vis[t] = false;
			}
		}
	}
	
    //判断相邻格子的数字是否连续
	private static boolean check(int num, int i, int j) {
	        if(i-1>=0 && (table[i-1][j] == num+1 || table[i-1][j] == num-1)){   //判断上方格子
	            return false ;
	        }
	        if(j-1>=0 && (table[i][j-1] == num+1 || table[i][j-1] == num -1)){  //判断左方格子
	            return false ;
	        }
	        if(i-1>=0 && j-1 >= 0 && (table[i-1][j-1] == num+1 || table[i-1][j-1] == num - 1)){ //判断左上方格子
	            return false ;
	        }
	        if(i-1>=0 && j+1 < 4 && (table[i-1][j+1] ==num+1 || table[i-1][j+1] == num - 1)){   //判断右上方格子
	            return false ;
	        }
	        if(j+1<4 && (table[i][j+1] == num+1 || table[i][j+1] == num-1)){    //判断右方格子
	            return false ;
	        }
	        if(i+1<3 && (table[i+1][j] == num+1 || table[i+1][j] == num-1)){    //判断下方格子
	            return false ;
	        }
	        if(i+1<3 && j-1>=0 && (table[i+1][j-1] == num+1 || table[i+1][j-1] == num-1)){  //判断左下方格子
	            return false ;
	        }
	        if(i-1<0 && j+1<4 && (table[i+1][j+1] == num+1 || table[i+1][j+1] == num-1)){   //判断右下方格子
	            return false ;
	        }
	        return true ;
	    }
}
 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!