基于java-解九宫格(数独)

程序源码如下:

package numberGame; 
 
 
public class Point { 
    private int col;// 行号 
    private int row;// 列号 
    private boolean flag;// 真为未设置。 
    private int value; 
    // 构造点 
    public Point(int col, int row, boolean flag, int value) { 
        super(); 
        this.col = col; 
        this.row = row; 
        this.flag = flag; 
        this.value = value; 
    } 
 
    public void changeFlag() { 
        flag = !flag; 
    } 
 
 
    public boolean getFlag() { 
        return flag; 
    } 
 
    public int getValue() { 
        return value; 
    } 
 
    public void setValue(int value) { 
        this.value = value; 
    } 
 
    public boolean canHere(Point[][] pArr) { 
        boolean cb = canCol(pArr); 
        boolean cr = canRow(pArr); 
        boolean cminiArr = canMiniArr(pArr); 
        return cb  cr  cminiArr; 
    } 
    //判断在小3*3格子里是否有相同元素 
    private boolean canMiniArr(Point[][] pArr) { 
        int coltemp = this.col % 3; 
        int rowtemp = this.row % 3; 
 
        for (int i = this.col - coltemp; i  col + (3 - coltemp); i++) { 
            for (int j = this.row - rowtemp; j  row + (3 - rowtemp); j++) { 
                if(i == this.col  j == this.row){ 
                    continue; 
                }else{               
                    if(this.value == pArr[i][j].getValue()){ 
                        return false; 
                    }                
                } 
            } 
        } 
        return true; 
    } 
 
    // 判断列上是否有相同元素 
    private boolean canRow(Point[][] pArr) { 
        for (int i = 0; i  9; i++) { 
            if (i == this.col) { 
                continue; 
            } else { 
                if (this.value == pArr[i][this.row].value) {// 行变,列不变 
                    return false; 
                } 
            } 
        } 
        return true; 
    } 
 
    // 判断行上是否有相同元素 
    private boolean canCol(Point[][] pArr) { 
        for (int i = 0; i  9; i++) { 
            if (i == this.row) { 
                continue; 
            } else { 
                if (this.value == pArr[this.col][i].value) {// 列边,行不变 
                    return false; 
                } 
            } 
        } 
        return true; 
    } 
} 



-----主程序


package numberGame; 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;


public class Number99 {

public static void main(String[] args) throws IOException{
Point[][] numMat = new Point[9][9];
ArrayListPoint al = new ArrayListPoint();

initNumMat(numMat,al);


setNum(numMat,al);
printMat(numMat);
}

private static void setNum(Point[][] numMat,ArrayListPoint al) {
int i = 0;
int j = 0;
do{
if (numMat[i][j].getFlag()) {
for (int v = numMat[i][j].getValue()+1; v = 9; v++) {//给回退到的位置的值加一。
numMat[i][j].setValue(v);
if (numMat[i][j].canHere(numMat)) {//满足条件,不冲突。
numMat[i][j].changeFlag();//改变标记为假。表示已设置过。
break;
}else{//满足不条件,冲突。value值自加一次
}

while(v == 9){//如果1-9都不能满足要求,则先将本位重置为0,并回退一格,给回退到的位置的值加一(当回退位置的值不为9时,并且保证回退到的位置不是九宫格原本的点)。
numMat[i][j].setValue(0);
j--;
if(j==-1){
i--;j=8;
}
while(al.contains(numMat[i][j])){//如果回退到的位置为九宫格本来的点时,继续回退,直到不是本身的点时跳出while。
j--;
if(j==-1){
i--;j=8;
}
}
numMat[i][j].changeFlag();//将标记
v = numMat[i][j].getValue();
}
}
}
j++;
if(j==9){
j=0;i++;//此处i++ 可能使i自加为9,故下面需要i!=9判断
}
if(i!=9){
while(al.contains(numMat[i][j])){
j++;
if(j==9){
j=0;i++;
}
}
}
}while(i!=9);

}

public static void initNumMat(Point[][] numMat,ArrayListPoint al) throws IOException {
for (int i = 0; i numMat.length; i++) {
for (int j = 0; j numMat[i].length; j++) {
numMat[i][j] = new Point(i, j, true, 0);
}
}
initNumMat2(numMat, al);

}

public static void initNumMat2(Point[][] numMat, ArrayListPoint al) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] p = new String[3];
String line=null;
System.out.println("请按格式输入点信息(i行号, j列号 v值),输入结束输入over: i j v ");

while((line = br.readLine())!=null){
if(line.equals("over"))
break;
p = line.trim().split(" +");
numMat[Integer.parseInt(p[0])][Integer.parseInt(p[1])].setValue(Integer.parseInt(p[2]));
numMat[Integer.parseInt(p[0])][Integer.parseInt(p[1])].changeFlag();
al.add(numMat[Integer.parseInt(p[0])][Integer.parseInt(p[1])]);
}
}

public static void printMat(Point[][] numMat) {
System.out.println("--------┬---------┬---------┐");

for (int i = 0; i numMat.length; i++) {
for (int j = 0; j numMat[i].length; j++) {
if ((j + 1) % 3 == 0)
System.out.print(numMat[i][j].getValue() + " | ");
else
System.out.print(numMat[i][j].getValue() + " ");
}
if ((i + 1) % 3 == 0)
System.out.println("\r\n--------┼---------┼---------┤");
else
System.out.println();
}
}

}



-------运行程序




请按格式输入点信息(i行号,j列号v值),输入结束输入over:ijv
008
123
136
217
249
262
315
357
444
455
467
531
573
621
676
688
728
735
771
819
864
over
--------┬---------┬---------┐
812|753|649|
943|682|175|
675|491|283|
--------┼---------┼---------┤
154|237|896|
369|845|721|
287|169|534|
--------┼---------┼---------┤
521|974|368|
438|526|917|
796|318|452|
--------┼---------┼---------┤


原文链接:http://blog.csdn.net/liuhenghui5201/article/details/8987311


posted @ 2013-06-08 00:23:05 kuye 阅读(5908) 评论(0)
发表评论
昵称
邮箱
网址