一道数字游戏题
时间:2008-08-30 12:00:56
来源:论坛整理 作者: 编辑:chinaitzhe
public class mathMain {
/**
* @param args
*
* 要求:9x9
* 每行每列都不重复出现 1 到 9 的数字
* 没有填上的数字用 0 填充
* 要求解 0 上的数字
*/
//在全局上 要 用到回朔算法
public int[][] num = null;
public int[][] num2 = null;//用与比较
int HC = 0; //回朔的列位置
int HR = 0; //回朔的行位置
int NM=-3;
public static void main(String[] args) {
// TODO 自动生成方法存根
mathMain m = new mathMain();
m.math();
m.TestData();
m.outPut();
System.exit(0);
}
public void math() {
//构造 对应的 Array
num = new int[][] {
{
0, 7, 4, 6, 0, 0, 0, 0, 2}, {
0, 9, 0, 0, 4, 7, 0, 6, 0}, {
0, 0, 1, 0, 0, 3, 9, 4, 0}, {
0, 2, 0, 4, 0, 6, 7, 0, 9}, {
9, 0, 0, 7, 0, 0, 4, 0, 5}, {
4, 0, 7, 0, 0, 0, 0, 8, 0}, {
0, 4, 8, 5, 0, 0, 0, 0, 0}, {
0, 5, 0, 0, 8, 0, 1, 7, 0}, {
1, 0, 0, 9, 7, 4, 5, 2, 0}
};
num2 = new int[][]{
{
0, 7, 4, 6, 0, 0, 0, 0, 2}, {
0, 9, 0, 0, 4, 7, 0, 6, 0}, {
0, 0, 1, 0, 0, 3, 9, 4, 0}, {
0, 2, 0, 4, 0, 6, 7, 0, 9}, {
9, 0, 0, 7, 0, 0, 4, 0, 5}, {
4, 0, 7, 0, 0, 0, 0, 8, 0}, {
0, 4, 8, 5, 0, 0, 0, 0, 0}, {
0, 5, 0, 0, 8, 0, 1, 7, 0}, {
1, 0, 0, 9, 7, 4, 5, 2, 0}
};
System.out.println("数组实例化成功!!!");
}
//实现具体
//约束条件 每行每列 都 满足 出现1到9的数字且不重复
public void TestData() {
//给num[i][j]付恰当的值 满足约束
int i=0;
int j=0;
boolean RowLogic;
boolean CountLogic;
while(true){
RowLogic=RowLogic(i,j);
CountLogic=CountLogic(i,j);
if((RowLogic&&CountLogic)&&(i == 9)&&(j==9)){
break;
}
if (RowLogic&&CountLogic) {
if(j==9&&i <9)
i;
if(i <=9&&j <9)
j;
}
if ( (num[i][j] == 9) && ((RowLogic == false) ¦ ¦(RowLogic==false))) {
num[i][j] = 0;
Back(i,j);
i=HR;
j=HR;
}
}
}
public boolean RowLogic(int i,int j){
boolean flag=false;
if (num[i][j] == 0) {
num[i][j] = 1;
}
for (int k0 = 0; k0 < num.length; k0 ) { //行判断
if (num[i][j] == num[i][k0] && (j != k0) && num[i][j] < 9&&num[i][j]!=NM) {
num[i][j] = num[i][j] 1;
break;
}
else {
if(num[i][j]!=NM)
flag=true;
if(num[i][j]==NM){
NM=-3;
}
}
}
return flag;
}
public boolean CountLogic(int i,int j){
boolean flag=false;
if (num[i][j] == 0) {
num[i][j] = 1;
}
for (int k1 = 0; k1 < num.length; k1 ) { //列判断
if (num[i][j] == num[k1][j] && (i != k1) && (num[i][j] < 9)&&(num[i][j]!=NM)) {
num[i][j] = num[i][j] 1;
break;
}
else {
if(num[i][j]!=NM)
flag=true;
if(num[i][j]==NM){
NM=-3;
}
}
}
return flag;
}
public void Back(int i,int j) { //回滚到上级
if(j <9&&j>0){
HC=j-1;
HR=i;
}else if(j==0&&i>0){
HR=i-1;
HC=8;
}else if(i==0&&j==0){
System.out.println("此题 无解");
}
}
public void outPut() {
int no = 0;
for (int i = 0; i < num.length; i ) {
for (int j = 0; j < num.length; j ) {
if (i > no) {
System.out.println("");
}
System.out.print("" num[i][j]);
no = i;
}
}
}
}
网友回复:是不是解数独哦?
我运行结果是:
- Java code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ 数组实例化成功!!! Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9 at mathMain.TestData(mathMain.java:61) at mathMain.main(mathMain.java:19)
网友回复:这个我明白 是数组越界 但 我改变 后!还是难一求出 和迷宫求解 有点像!!!!!!
public class mathMain {
/**
* @param args
*/
/**
* 要求:9x9
* 每行每列都不重复出现 1 到 9 的数字
* 没有填上的数字用 0 或者 0 填充
*/
//在全局上 要 用到回朔算法
public int[][] num = null;
public int[][] num2 = null;
int HC = 0; //回朔的列位置
int HR = 0; //回朔的行位置
int NM = -3;
public void math() {
//构造 对应的 Array
num = new int[][] {
{
0, 7, 4, 6, 0, 0, 0, 0, 2}, {
0, 9, 0, 0, 4, 7, 0, 6, 0}, {
0, 0, 1, 0, 0, 3, 9, 4, 0}, {
0, 2, 0, 4, 0, 6, 7, 0, 9}, {
9, 0, 0, 7, 0, 0, 4, 0, 5}, {
4, 0, 7, 0, 0, 0, 0, 8, 0}, {
0, 4, 8, 5, 0, 0, 0, 0, 0}, {
0, 5, 0, 0, 8, 0, 1, 7, 0}, {
1, 0, 0, 9, 7, 4, 5, 2, 0}
};
num2 = new int[][] {
{
0, 7, 4, 6, 0, 0, 0, 0, 2}, {
0, 9, 0, 0, 4, 7, 0, 6, 0}, {
0, 0, 1, 0, 0, 3, 9, 4, 0}, {
0, 2, 0, 4, 0, 6, 7, 0, 9}, {
9, 0, 0, 7, 0, 0, 4, 0, 5}, {
4, 0, 7, 0, 0, 0, 0, 8, 0}, {
0, 4, 8, 5, 0, 0, 0, 0, 0}, {
0, 5, 0, 0, 8, 0, 1, 7, 0}, {
1, 0, 0, 9, 7, 4, 5, 2, 0}
};
System.out.println("数组实例化成功!!!");
}
//实现具体
//约束条件 每行 都 满足 出现1到9的数字且不重复
public void TestData() {
//给num[i][j]付恰当的值 满足约束
int i = 0;
int j = 0;
boolean RowLogic;
boolean CountLogic;
while (true) {
RowLogic = RowLogic(i, j);
CountLogic = CountLogic(i, j);
if (RowLogic && CountLogic) {
if (j == 8 && i < 8) {
i;
}
if (i <= 8 && j < 8) {
j;
}
}
if ( (num[i][j] == 8) && ( (RowLogic == false) ¦ ¦ (RowLogic == false))) {
num[i][j] = 0;
Back();
i = HR;
j = HR;
}
if ( (RowLogic && CountLogic) && (i == 8) && (j == 8)) {
break;
}
}
}
public boolean rowLog2(int i, int j){
boolean flag=false;
for (int k0 = 0; k0 < num.length; k0 ){
if(num[i][j] != num[i][k0] && (j != k0) && num[i][j] < 9){
flag=true;
}
}
return flag;
}
public boolean RowLogic(int i, int j) {
boolean flag = false;
if (num[i][j] == 0) {
num[i][j] = 1;
}
for (int k0 = 0; k0 < num.length; k0 ) { //行判断
if ((num[i][j] == num[i][k0] && (j != k0) && num[i][j] < 9) ¦ ¦
num[i][j] == NM) {
num[i][j] = num[i][j] 1;
}
else {
if (num[i][j] != NM) {
flag = true;
}
if (num[i][j] == NM) {
NM = -3;
}
}
}
return flag;
}
public boolean CountLogic(int i, int j) {
boolean flag = false;
boolean row2=false;
if (num[i][j] == 0) {
num[i][j] = 1;
}
for (int k1 = 0; k1 < num.length; k1 ) { //列判断
if ((num[i][j] == num[k1][j] && (i != k1) && (num[i][j] < 9)) ¦ ¦
(num[i][j] == NM)) {
num[i][j] = num[i][j] 1;
}
else {
if (num[i][j] != NM) {
flag = true;
}
if (num[i][j] == NM) {
NM = -3;
}
}
if(flag){
if (RowLogic(i,j)){
System.out.println("更新一个成功!");
}else{
Back();
i=HR;
j=HC;
flag=false;
}
}
}
return flag;
}
public void Back() { //回滚到上级
for (int row = 0; row < num.length; row ) {
for (int col = 0; col < num.length; col ) {
if (num[row][col] != 0 && num2[row][col] == 0) {
HR = row;
HC = col;
}
}
}
}
public static void main(String[] args) {
// TODO 自动生成方法存根
mathMain m = new mathMain();
m.math();
m.TestData();
m.outPut();
System.exit(0);
}
public void outPut() {
int no = 0;
for (int i = 0; i < num.length; i ) {
for (int j = 0; j < num.length; j ) {
if (i > no) {
System.out.println("");
}
System.out.print("" num[i][j]);
no = i;
}
}
}
}
网友回复:学习!!
关键字:数字,游戏,
上一篇:java中数组如何初始化
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面