java舞蹈_Java解数独算法(非舞蹈链)

backdate) {

for(int i=0; ii; j--) {

int a = backdate.get(j-1);

int b = backdate.get(j);

if(bigThan(a, b)) {

backdate.set(j-1, b);

backdate.set(j, a);

}

}

}

}

private boolean bigThan(int sit1, int sit2) {

return this.count(get(sit1)) > this.count(get(sit2));

}

// 标准函数,统计整数在二进制位上有几个1

private int count(int m) {

int temp = m - ((m>>1)&033333333333) - ((m>>2)&011111111111);

return ((temp + (temp>>3)) & 030707070707) % 63;

}

// 当数位上有且只有一个1时,其位数恰好表示数独中唯一可选的值

private int convert(int p2n) {

int t = 0;

while(p2n!=1) {

t++;

p2n>>=1;

}

return t;

}

// 主函数处理区

private static void readsudo(int[][] sudo, Scanner scan) {

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

sudo[i] = new int[9];

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

sudo[i][j] = scan.nextInt();

}

}

}

private static void printSudo(int[][] sudo) throws Exception {

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out), 1 << 16);

for(int[] cs : sudo) {

for(int c : cs) {

writer.write(c + " ");

}

writer.write("\r\n");

}

writer.flush();

}

public static void main(String args[]) throws Exception {

/*

String data =

"0 6 0 5 9 3 0 0 0\n"+

"9 0 1 0 0 0 5 0 0\n"+

"0 3 0 4 0 0 0 9 0\n"+

"1 0 8 0 2 0 0 0 4\n"+

"4 0 0 3 0 9 0 0 1\n"+

"2 0 0 0 1 0 6 0 9\n"+

"0 8 0 0 0 6 0 2 0\n"+

"0 0 4 0 0 0 8 0 7\n"+

"0 0 0 7 8 5 0 1 0";

*/

/*

String data =

"0 0 0 3 4 0 0 0 0\n"+

"8 0 0 0 0 0 0 2 0\n"+

"0 7 0 0 1 0 5 0 0\n"+

"4 0 0 0 0 5 3 0 0\n"+

"0 1 0 0 7 0 0 0 6\n"+

"0 0 3 2 0 0 0 8 0\n"+

"0 6 0 5 0 0 0 0 9\n"+

"0 0 4 0 0 0 0 3 0\n"+

"0 0 0 0 0 9 7 0 0";

*/

/*

String data =

"0 0 0 0 0 0 0 0 0\n"+

"0 0 0 0 0 0 0 0 0\n"+

"0 0 0 0 0 0 0 0 0\n"+

"0 0 0 0 0 0 0 0 0\n"+

"0 0 0 0 0 0 0 0 0\n"+

"0 0 0 0 0 0 0 0 0\n"+

"0 0 0 0 0 0 0 0 0\n"+

"0 0 0 0 0 0 0 0 0\n"+

"0 0 0 0 0 0 0 0 0";

*/

/*

String data =

"0 0 0 4 0 0 0 0 7\n"+

"0 1 0 0 0 0 0 0 0\n"+

"0 0 0 0 2 0 0 0 0\n"+

"6 0 0 0 5 0 2 7 0\n"+

"0 0 0 0 0 0 8 3 0\n"+

"7 0 0 0 0 0 0 0 0\n"+

"2 0 6 0 0 0 5 0 0\n"+

"0 0 0 1 0 0 0 0 4\n"+

"0 0 0 3 0 0 0 0 0";

*/

/*

String data =

"0 6 0 5 9 3 0 0 0\n"+

"9 0 1 0 0 0 5 0 0\n"+

"0 3 0 4 0 0 0 9 0\n"+

"1 0 8 0 2 0 0 0 4\n"+

"4 0 0 3 0 9 0 0 1\n"+

"2 0 0 0 1 0 6 0 9\n"+

"0 8 0 0 0 6 0 2 0\n"+

"0 0 4 0 0 0 8 0 7\n"+

"0 0 0 7 8 5 0 1 0";

*/

/*

String data =

"7 6 2 5 0 3 1 4 8\n"+

"9 4 1 0 0 8 5 3 6\n"+

"8 3 5 4 0 0 7 9 2\n"+

"1 9 8 6 2 0 3 5 4\n"+

"4 7 6 3 5 0 2 8 1\n"+

"2 5 3 8 1 0 6 7 9\n"+

"3 8 7 1 4 0 9 2 5\n"+

"5 1 4 9 3 0 8 6 7\n"+

"6 2 9 7 8 0 4 1 3";

*/

// 51nod 题号 1211 数据格式

Scanner scan = new Scanner(new ByteArrayInputStream(data.getBytes()));

int[][] sudo = new int[9][];

readsudo(sudo, scan);

if(new Solution().solveSudoku(sudo)) {

printSudo(sudo);

} else {

System.out.println("No Solution");

}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值