php开发数独,数独解题小程序实现代码

自己用Java写了一个9x9数独解题的小程序,用的是穷举法,解一般的题目问题不大

代码如下:package Test;

public class SensibleGame {

/**

* @param args

*/

int[][] mainNumber;

boolean[][] flagNumber;

public SensibleGame(int[][] mainNumber)

{

this.mainNumber = mainNumber;

flagNumber = new boolean[9][9];

for(int i=0;i<9;i++)

{

for(int j=0;j<9;j++)

{

if(mainNumber[i][j] == 0)

{

flagNumber[i][j] = false;

}

else

{

flagNumber[i][j] = true;

}

}

}

}

public boolean CheckRow(int i, int j)//检查(i,j)位置的行是否满足数独条件

{

// 代码省略

}

public boolean CheckColumn(int i, int j)//检查(i,j)位置的列是否满足数独条件

{

//代码省略

}

public boolean CheckRound(int i, int j)//检查(i,j)位置所在的3x3格是否满足数独条件

{

//代码省略

}

public void run()//计算方法 穷举填数过程

{

int i = 0;

int j = 0;

boolean previousFlag = false;

while(true)

{

if(i<0 || i>8 || j<0 || j>8)

{

System.out.print("下标越界!");

return;

}

if(previousFlag == false)

{

if(flagNumber[i][j] == true)

{

previousFlag = false;

if(i==8 && j==8)

{

System.out.print("计算结束\n");

break;

}

else if(i>=0&&i<8&&j==8)

{

i = i + 1;

j = 0;

continue;

}

else

{

j = j + 1;

continue;

}

}

boolean flag = false;

int k = 0;

while(!flag && k<9)

{

mainNumber[i][j] = ++k;

flag = CheckAll(i, j);

}

if(flag == true)

{

previousFlag = false;

if(i==8&&j==8)

{

System.out.println("计算结束\n");

}

else if(i>=0&&i<8&&j==8)

{

i = i + 1;

j = 0;

continue;

}

else

{

j = j + 1;

continue;

}

}

else

{

previousFlag = true;

mainNumber[i][j] = 0;

if(i==0&&j==0)

{

System.out.println("计算失败\n");

}

else if(i>0&&i<9&&j==0)

{

i = i -1;

j = 8;

continue;

}

else

{

j = j - 1;

continue;

}

}

}

else

{

if(flagNumber[i][j] == true)

{

previousFlag = true;

if(i==0&&j==0)

{

System.out.println("计算失败\n");

break;

}

else if(i>0&&i<9&&j==0)

{

i = i - 1;

j = 8;

continue;

}

else

{

j = j - 1;

continue;

}

}

boolean flag = false;

while(!flag && mainNumber[i][j]<9 && mainNumber[i][j]>0)

{

mainNumber[i][j] = mainNumber[i][j] + 1;

flag = CheckAll(i, j);

}

if(flag == true)

{

previousFlag = false;

if(i==8&&j==8)

{

System.out.println("计算结束\n");

break;

}

else if(i>=0&&i<8&&j==8)

{

i = i + 1;

j = 0;

continue;

}

else

{

j = j + 1;

continue;

}

}

else

{

previousFlag = true;

mainNumber[i][j] = 0;

if(i==0&&j==0)

{

System.out.println("计算失败\n");

break;

}

else if(i>0&&i<9&&j==0)

{

i = i - 1;

j = 8;

continue;

}

else

{

j = j - 1;

continue;

}

}

}

}

}

public void Print()//打印

{

int k =0;

for(int i=0;i<9;i++)

{

for(int j=0;j<9;j++)

{

System.out.print(mainNumber[i][j]);

if((++k)%9 == 0)

{

System.out.println("");

}

}

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

int[][] mainNumber = {{0,9,0,0,1,0,0,2,0},

{7,0,0,0,0,8,3,0,0},

{0,0,0,0,0,0,4,0,0},

{8,3,0,0,0,0,0,1,0},

{0,0,6,0,0,0,0,0,5},

{0,4,0,7,0,0,0,0,0},

{0,0,0,0,0,7,8,9,0},

{0,2,1,0,0,0,0,0,0},

{3,0,0,0,5,0,0,0,6},

};

SensibleGame sensibleGame = new SensibleGame(mainNumber);

sensibleGame.run();

sensibleGame.Print();

}

}

运行结果如下:

计算结束

493516728

762498351

185372469

837925614

216843975

549761283

654137892

921684537

378259146

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值