当前位置:编程学习 > JAVA >>

Java解数独--世界最难数独

在其他地方看到这个方法,稍微修改了一下,贴出来

用到Shudu和Grid两个类,

运行 Shudu里的main方法,

我读取的是本地文件,据说这个是神马大师设计的最难数独,大家可以自行修改

 

package shudu;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

public class Shudu {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date begin=dfs.parse(dfs.format(new Date()));
        
    	String arg = "C:/shudu.txt";
        FileReader rd = new FileReader(arg);
        while (true) {
            Grid grid = Grid.create(rd);
            if (grid == null) {
                break;
            }
            List<Grid> solutions = new ArrayList<Grid>();
            
            solve(grid, solutions);

            printSolutions(grid, solutions);   
        }
        
        Date end=dfs.parse(dfs.format(new Date()));
        long between=end.getTime()-begin.getTime();
        System.out.println("use Time:"+between+"ms");
    }

    private static void solve(Grid grid, List<Grid> solutions) {

        if (solutions.size() >= 2) {
            return;
        }

        int loc = grid.findEmptyCell();

        if (loc < 0) {
            solutions.add(grid.clone());
            return;
        }

        for (int n=1; n<10; n++) {
            if (grid.set(loc, n)) {
                solve(grid, solutions);

                grid.clear(loc);
            }
        }
    }

    private static void printSolutions(Grid grid, List<Grid> solutions) {
        System.out.println("Original");
        System.out.println(grid);

        if (solutions.size() == 0) {
            System.out.println("Unsolveable");
        } else if (solutions.size() == 1) {
            System.out.println("Solved");
        } else {
            System.out.println("At least two solutions");
        }

        for (int i=0; i<solutions.size(); i++) {
            System.out.println(solutions.get(i));
        }
        System.out.println();
        System.out.println();
    }
}
package shudu;

import java.io.Reader;


public class Grid implements Cloneable {
    int[] cells = new int[81];

    int[] colsSet = new int[9];

    int[] rowsSet = new int[9];

    int[] subgridSet = new int[9];

    
    public static Grid create(Reader rd) throws Exception {
        Grid grid = new Grid();

       
        for (int loc=0; loc<grid.cells.length; ) {
          
            int ch = rd.read();

            if (ch < 0) {

                return null;
            }
            if (ch == '#') {

                while (ch >= 0 && ch != '\n' && ch != '\r') {
                    ch = rd.read();
                }
            } else if (ch >= '1' && ch <= '9') {

                grid.set(loc, ch-'0');
                loc++;
            } else if (ch == '.' || ch == '0') {

                loc++;
            }
        }
        return grid;
    }


    public int findEmptyCell() {
        for (int i=0; i<cells.length; i++) {
            if (cells[i] == 0) {
                return i;
            }
        }
        return -1;
    }

   
    public boolean set(int loc, int num) {
        // Compute row and column
        int r = loc/9;
        int c = loc%9;
        int blockLoc = (r/3)*3+c/3;

        boolean canSet = cells[loc] == 0
            && (colsSet[c] & (1<<num)) == 0
            && (rowsSet[r] & (1<<num)) == 0
            && (subgridSet[blockLoc] & (1<<num)) == 0;
        if (!canSet) {
            return false;
        }

        cells[loc] = num;
        colsSet[c] |= (1<<num);
        rowsSet[r] |= (1<<num);
        subgridSet[blockLoc] |= (1<<num);
        return true;
    }


    public void clear(int loc) {
        // Compute row and column
        int r = loc/9;
        int c = loc%9;
        int blockLoc = (r/3)*3+c/3;

        int num = cells[loc];
        cells[loc] = 0;
        colsSet[c] ^= (1<<num);
        rowsSet[r] ^= (1<<num);
        subgridSet[blockLoc] ^= (1<<num);
    }


    public Grid clone() {
        Grid grid = new Grid();
        grid.cells = cells.clone();
        grid.colsSet = colsSet.clone();
        grid.rowsSet = rowsSet.clone();
        grid.subgridSet = subgridSet.clone();
        return grid;
    }


    public String toString() {
        StringBuffer buf = new StringBuffer();
        for (int r=0; r<9; r++) {
            if (r%3 == 0) {
                buf.append("-------------------------\n");
            }
            for (int c=0; c<9; c++) {
                if (c%3 == 0) {
                    buf.append("| ");
                }
                int num = cells[r*9+c];
                if (num == 0) {
                    buf.append("0 ");
                } else {
                    buf.append(num+" ");
                }
            }
            buf.append("|\n");
        }
        buf.append("-------------------------");
        return buf.toString();
    }
}





 

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,