兴趣来了,写了个简单的数独游戏计算程序,未做算法优化。

通过文件来输入一个二维数组,9行,每行9个数组,数独游戏中需要填空的地方用0来表示。结果也是打印二维数组。

 import java.io.File;
import java.util.List;
//代表数独中的一个单元格位置
public class Cell { // 所在行
public int row;
// 所在列
public int colum;
// 值
public int value; public static int rowMax = 9; public static int columMax = 9; public static Cell[][] pan = new Cell[rowMax][columMax]; // 初期化数独游戏
public static void init() {
// 数独盘上的值输入下面文件中,共9行,每行9个数字
// 0表示需要计算的空着的区域,
// eg:
// -----------------------
// 008309100
// 900060004
// 007504800
// 036000540
// 001000600
// 042000970
// 005907300
// 600010008
// 004608200
// -------------------------
File f = new File("conf/sd.txt");
List<List<Integer>> list = SDUtil.initQiPan(f);
for (int i = 0; i < rowMax; i++) {
for (int j = 0; j < columMax; j++) {
pan[i][j] = new Cell(i, j);
pan[i][j].value = list.get(i).get(j);
}
}
} // 取得下一个需要计算的位置
public Cell getNext() {
Cell next = null;
int row = 0;
int colum = 0;
if (this.row + 1 < rowMax) {
row = this.row + 1;
colum = this.colum;
} else if (this.colum + 1 < columMax) {
row = 0;
colum = this.colum + 1;
} else {
return null;
}
next = pan[row][colum];
return next;
} private Cell(int row, int colum) {
this.row = row;
this.colum = colum;
} }
 import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List; public class SDUtil { //把配置文件转换成二维列表
public static List<List<Integer>> initQiPan(File f) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
try {
BufferedReader br = new BufferedReader(new FileReader(f));
String s;
while ((s = br.readLine()) != null) {
s = s.trim();
char[] car = s.toCharArray();
List<Integer> l = new ArrayList<Integer>();
for (int i = 0; i < 9; i++) {
l.add(Integer.parseInt("" + car[i]));
}
list.add(l);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
 import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; public class ShuDu { static List<String> allNum = Arrays.asList("1", "2", "3", "4", "5", "6",
"7", "8", "9"); public static void main(String[] args) {
begin(); } public static void begin() {
//初期化,数独中原有的数字装入
Cell.init();
//第一个位置取得
Cell beginCell = Cell.pan[0][0];
//计算
insertCell(beginCell);
} //打印结果
public static void printOkValue() {
for (int i = 0; i < Cell.rowMax; i++) {
for (int j = 0; j < Cell.columMax; j++) {
System.out.print(Cell.pan[i][j].value + " ");
}
System.out.println();
}
} //计算并插入正确的值(主要逻辑方法)
public static boolean insertCell(Cell cell) {
if (cell.value == 0) {
List<String> canList = getCanInList(cell.row, cell.colum);
if (canList.size() == 0) {
return false;
}
for (String can : canList) {
cell.value = Integer.parseInt(can);
Cell nextCell = cell.getNext();
if (nextCell != null) {
boolean b = insertCell(nextCell);
if (b) {
return true;
}
} else {
printOkValue();
System.exit(0);
;
}
}
cell.value = 0;
} else {
Cell nextCell = cell.getNext();
if (nextCell != null) {
boolean b = insertCell(nextCell);
if (b) {
return true;
}
} else {
printOkValue();
System.exit(0);
;
}
} return false;
} //取得所在位置的所有可能数字列表
public static List<String> getCanInList(int row, int colum) {
List<String> canList = new ArrayList<String>();
canList.addAll(allNum);
lineValidate(canList, row, colum, Cell.columMax);
columValidate(canList, row, colum, Cell.rowMax);
blockValidate(canList, row, colum);
return canList;
} //行验证
public static void lineValidate(List<String> set, int row, int colum,
int max) {
for (int i = 0; i < max; i++) {
String value = Cell.pan[row][i].value + "";
if (value.equals("0")) {
continue;
}
set.remove(value);
}
} //列验证
public static void columValidate(List<String> set, int row, int colum,
int max) {
for (int i = 0; i < max; i++) {
String value = Cell.pan[i][colum].value + "";
if (value.equals("0")) {
continue;
}
set.remove(value);
}
} //所求位置所在的9个块验证
public static void blockValidate(List<String> canList, int row, int colum) {
int blockRow = row / 3 * 3;
int blockColum = colum / 3 * 3;
for (int i = 0 + blockRow; i < 3 + blockRow; i++) {
for (int j = 0 + blockColum; j < 3 + blockColum; j++) {
String value = Cell.pan[i][j].value + "";
if (value.equals("0")) {
continue;
}
canList.remove(value);
}
}
}
}

java程序计算数独游戏的更多相关文章

  1. Java实现 蓝桥杯 数独游戏

    你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一 ...

  2. Java程序,猜大小游戏

    一个骰子,通常有1.2.3.4.5.6等6种点数.我们将1.2.3记作“小”,将4.5.6记作“大”.猜中显示“猜对了”,猜错记作“猜错了”之类的字样.本程序可以用Java实现. import jav ...

  3. 35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n

      35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现in ...

  4. 游戏服java程序启动,显示内存溢出

    1.OutOfMemoryError:Java heap space 过程:服务器上面的mysql突然异常重启,导致了程序启动的时候报错 问题1:OutOfMemoryError:Java heap ...

  5. 怎样通过Java程序提交yarn的mapreduce计算任务

    因为项目需求,须要通过Java程序提交Yarn的MapReduce的计算任务.与一般的通过Jar包提交MapReduce任务不同,通过程序提交MapReduce任务须要有点小变动.详见下面代码. 下面 ...

  6. 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行

    [TOC] 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行 程序源码 import java.io.IOException; import java.util. ...

  7. Java初学者作业——编写程序计算实发工资(实践1)

    返回本章节 返回作业目录 需求说明: 腾讯为Java工程师提供了基本工资(8000元).物价津贴及房租津贴.其中物价津贴为基本工资的40%,房屋津贴为基本工资的25%.要求编写程序计算实发工资. 实现 ...

  8. Java初学者作业——编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数。

    返回本章节 返回作业目录 需求说明: 编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数. 实现思路: 声明变量sum.count以及avg用于存储总成绩.班 ...

  9. Java初学者作业——编写Java程序,输入一个数字,实现该数字阶乘的计算。

    返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个数字,实现该数字阶乘的计算.一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! .例如,5的阶乘等于1*2*3*4* ...

随机推荐

  1. BC-NFS部署报错节点间磁盘wwid冲突

    1.在部署公司的BC-NFS产品时,填好IP选好磁盘后,点击“创建”,就抛出如下提示: 2.关闭虚机,再打开虚机的控制台,点击磁盘,自定义serial number 3.启动虚机,再次登陆,查看磁盘w ...

  2. 浅谈对js原型的理解

    一.  在JavaScript中,一切皆对象,每个对象都有一个原型对象(prototype),而指向该原型对象的内部指针则是__proto__.当我们对对象进行for in 或者for of遍历时,就 ...

  3. css自媒体查询

    准备工作1:设置Meta标签 首先我们在使用Media的时候需要先设置下面这段代码,来兼容移动设备的展示效果: <meta name="viewport" content=& ...

  4. 【转】Django中的cookie与session

    转自:https://www.cnblogs.com/chenchao1990/p/5283725.html cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空 ...

  5. JDBC浅析

    今天简单的说一下jdbc,本来这玩意儿也很简单. 大家只需要记住其中的几个重要的类就行了,它们都在sql包里.今天主要是拿mysql来连接.先看一下主要的几个类吧. 1.Conenction 2.St ...

  6. java 中整数类型的进制转换

    int a=10; Integer.toBinaryString(a); //转换成2进制Integer.toOctalString(a);  //转换成8进制Integer.toHexString( ...

  7. Flask实战第59天:首页帖子布局完成

    编辑front_index.html <div id="carousel-example-generic" class="carousel slide index- ...

  8. [BZOJ3997][TJOI2015]组合数学(Dilworth定理+DP)

    题目名字是什么就不能往那方面想. 每个点拆成a[i][j]个,问题变为DAG最小路径覆盖,由Dilworth定理转成最长反链. 使用Dilworth定理的时候要注意那些点之间有边,这里任意一个点和其右 ...

  9. bzoj 2137: submultiple

                                                     Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 23 ...

  10. Codeforces 804E The same permutation(构造)

    [题目链接] http://codeforces.com/contest/804/problem/E [题目大意] 给出一个1到n的排列,问每两个位置都进行一次交换最终排列不变是否可能, 如果可能输出 ...