zoukankan      html  css  js  c++  java
  • 9*9宫格数独

    public class NumberDegrees {
    	
    	private final static int N = 3;
    	public static void main(String[] args) {
    		
    		 int x[][]={
                     {0,2,0,0,0,9,0,1,0,0},
                     {5,0,6,0,0,0,3,0,9,0},
                     {0,8,0,5,0,2,0,6,0,0},
                     {0,0,5,0,7,0,1,0,0,0},
                     {0,0,0,2,0,8,0,0,0,0},
                     {0,0,4,0,1,0,8,0,0,0},
                     {0,5,0,8,0,7,0,3,0,0},
                     {7,0,2,3,0,0,4,0,5,0},
                     {0,4,0,0,0,0,0,7,0,0},
             };
    		 NumberDegrees number = new NumberDegrees();
    		 number.function(x,0,0);
    		
    	}
    	
    	
    	public void function(int[][] x, int r, int c) {
    		//1.判断行数,如果是第九行或者大与9行的话直接输出数独
    		if (r >= x.length) {
    			show(x);
    			return;
    		}
    		//2.判断如果是3,6,9行的话判断前面的几行是否有重复数字
    		if (c == 0 && (r == x.length / 3 || r == x.length / 3 * 2 || r == x.length)) {
    			if(!checkBox(x, r)) {
    				return;
    			}
    		}
    		//3.判断是否是一行的最后一列,如果是,则跳转到下一行
    		if (c >= x.length) {
    			function(x, r + 1, 0);
    			return;
    		}
    		//4.判断是否是需要填的数字,如果是则填写正确的数字,如果不是则填写下一个
    		if (x[r][c] == 0) {
    			for (int i = 1; i <= x.length; i++) {
    				if(checked(x, r, c, i)) {
    					x[r][c] = i;
    					function(x, r, c + 1);
    					x[r][c] = 0;		
    				}
    			}
    			
    		} else {
    			function(x, r, c + 1);
    		}
    	}
    	/**
    	 * 判断这列这行的是否有数字与之相等
    	 * @param x
    	 * @param r
    	 * @param c
    	 * @param i
    	 * @return
    	 */
    	public boolean checked(int[][] x, int r, int c, int i) {
    		for (int j = 0; j < x.length; j++) {
    			if(x[r][j] == i) {
    				return false;
    			} 
    			if (x[j][c] == i) {
    				return false;
    			}
    		}
    		
    		return true;
    	}
    
    	
    	/**
    	 * 判断前几行是否有重复的数字
    	 * @param x
    	 * @param r
    	 * @return
    	 */
    	public boolean checkBox(int [][] x, int r) {
    		for (int k = 0; k < x.length; k += x.length / N) {
    			Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    			for (int i = r - N; i < r; i++) {
    				for (int j = k; j < k + x.length / N; j++) {
    					if (map.containsKey(x[i][j])) {
    						return false;
    					}
    					map.put(x[i][j], 1);
    				}
    			}
    		}
    		
    		return true;
    	}
    
    	public void show(int[][] x) {
    		for (int i = 0; i < x.length; i++) {
    			for (int j = 0; j < x.length; j++) {
    				System.out.print(x[i][j] + " ");
    			}
    			System.out.println();
    		}
    		System.out.println();
    	}
    
    }
    

      

  • 相关阅读:
    字符串数组
    常用函数
    判断是否是素数回文数
    杨辉三角
    惨痛的教训 没有 脑子的我
    剪缎带
    ?????函数不起作用
    C#3
    celery 原理和组件
    vue检查用户名是否重复
  • 原文地址:https://www.cnblogs.com/wangxiaowang/p/7818808.html
Copyright © 2011-2022 走看看