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* ...
随机推荐
- AC日记——Sagheer and Nubian Market codeforces 812c
C - Sagheer and Nubian Market 思路: 二分: 代码: #include <bits/stdc++.h> using namespace std; #defin ...
- bzoj 1407 扩展欧几里德
思路:枚举洞穴个数,用扩展欧几里德暴力判断没两个人的周期. #include<bits/stdc++.h> #define LL long long #define fi first #d ...
- Java数据库连接池-proxool
连接池技术的思想: 连接复用(高效.安全),避免数据库频繁建立.关闭的开销 --------------------极客学院(参考lulei) 1.配置文件 <proxool> <! ...
- centos定时备份数据库超简单示例
#mkdir -p /home/db_backup#cd /home/db_backup #vim mysql_backup.shDATE=$(date +%Y%m%d_%H%M%S) /alidat ...
- 转:攻击JavaWeb应用[3]-SQL注入
转:http://static.hx99.net/static/drops/tips-236.html 攻击JavaWeb应用[3]-SQL注入 园长 · 2013/07/16 18:28 注:本节重 ...
- python的版本会导致IBus设置(中文输入法)出错
最近在学习python,可是,发现我的输入法 IBus-pinyin ,不能用了, 现象: 发现 “首选输入法”,根本点击不进去IBus设置的窗口,想去设置输入法都不行, IBus设置的窗口: 原因是 ...
- python 简单日志框架 自定义logger
转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 通常我们在构建 python 系统时,往往需要一个简单的 logging 框架.python 自 ...
- KMP字符串匹配模板代码
洛谷的模板传送门 #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> ...
- C++中template的.h文件和.cpp文件的问题
在C++中,用到类模板时,如果类似一般的类声明定义一样,把类声明放在.h文件中,而具体的函数定义放在.cpp文件中的话,会发现编译器会报错.如类似下面代码: //test.h文件 #ifndef TE ...
- codevs 1014 装箱问题 2001年NOIP全国联赛普及组
题目描述 Description 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若 ...