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");
}
}
}