java程序计算数独游戏
兴趣来了,写了个简单的数独游戏计算程序,未做算法优化。
通过文件来输入一个二维数组,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程序计算数独游戏的更多相关文章
- Java实现 蓝桥杯 数独游戏
你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一 ...
- Java程序,猜大小游戏
一个骰子,通常有1.2.3.4.5.6等6种点数.我们将1.2.3记作“小”,将4.5.6记作“大”.猜中显示“猜对了”,猜错记作“猜错了”之类的字样.本程序可以用Java实现. import jav ...
- 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 ...
- 游戏服java程序启动,显示内存溢出
1.OutOfMemoryError:Java heap space 过程:服务器上面的mysql突然异常重启,导致了程序启动的时候报错 问题1:OutOfMemoryError:Java heap ...
- 怎样通过Java程序提交yarn的mapreduce计算任务
因为项目需求,须要通过Java程序提交Yarn的MapReduce的计算任务.与一般的通过Jar包提交MapReduce任务不同,通过程序提交MapReduce任务须要有点小变动.详见下面代码. 下面 ...
- 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行
[TOC] 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行 程序源码 import java.io.IOException; import java.util. ...
- Java初学者作业——编写程序计算实发工资(实践1)
返回本章节 返回作业目录 需求说明: 腾讯为Java工程师提供了基本工资(8000元).物价津贴及房租津贴.其中物价津贴为基本工资的40%,房屋津贴为基本工资的25%.要求编写程序计算实发工资. 实现 ...
- Java初学者作业——编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数。
返回本章节 返回作业目录 需求说明: 编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数. 实现思路: 声明变量sum.count以及avg用于存储总成绩.班 ...
- Java初学者作业——编写Java程序,输入一个数字,实现该数字阶乘的计算。
返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个数字,实现该数字阶乘的计算.一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! .例如,5的阶乘等于1*2*3*4* ...
随机推荐
- 【机器学习】k-近邻算法应用之手写数字识别
上篇文章简要介绍了k-近邻算法的算法原理以及一个简单的例子,今天再向大家介绍一个简单的应用,因为使用的原理大体差不多,就没有没有过多的解释. 为了具有说明性,把手写数字的图像转换为txt文件,如下图所 ...
- 前端读者 | 嗨,你知道this吗
本文来自 @position_柚子,地址:https://juejin.im/post/5995c7a76fb9a0247a60c407 在平时的代码中,相信大家经常用到 this,可是你真的明白此 ...
- VS2015运行 cordova 时候提示无法运行解决
出现此问题的原因是在于npm程序损坏了.vs调用的npm程序并不是在node安装目录下的npm,而是在: C:\Users\用户名\AppData\Roaming\Microsoft\VisualSt ...
- 转:LLVM与Clang的概述及关系
转:http://www.cnblogs.com/saintlas/p/5738739.html LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言 ...
- LBP,LBP-TOP的MATLAB公开代码
http://www.cse.oulu.fi/CMV/Downloads http://www.cse.oulu.fi/wsgi/CMV/Downloads/LBPMatlab
- 自定义word快捷键,设置插入图片快捷键
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 自定义word快捷键,设置插入图片快捷键 文件→选项→自定义功能区 选择键盘快捷方式 自 ...
- 【容斥原理】Codeforces Round #428 (Div. 2) D. Winter is here
给你一个序列,让你对于所有gcd不为1的子序列,计算它们的gcd*其元素个数之和. 设sum(i)为i的倍数的数的个数,可以通过容斥算出来. 具体看这个吧:http://blog.csdn.net/j ...
- 【动态规划】CDOJ1651 Uestc的命运之旅
要处理从四个角出发的答案.最后枚举那个交点,然后讨论一下来的方向即可. #include<cstdio> #include<algorithm> using namespace ...
- bzoj 3790: 神奇项链
3790: 神奇项链 Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字 母组成的字符串,每个小写字母表示一种颜色.为了制作这个项链,小 H 购买了 ...
- Java编程思想学习(一)----对象导论中多态的理解
1.1抽象过程 1)万物皆对象. 2)程序是对象的集合,他们通过发送消息来告知彼此所要求做的. 3)每个对象都有自己的由其他对象所构成的存储. 4)每个对象都拥有其类型. 5)某一特定类型的所有对象都 ...