数独博士1.5
问候,
本文的第二部分定义了两组方法。 一种方法
能够读取整个数独板以及几种可以编写的方法
这样的板子,格式很好。
我们想要一种可以从
阅读器流并初始化相应地登上。 如果我们可以阅读文本文件,将非常方便
其内容如本示例第一部分所示的示例板中所示
文章。
基本上,我们希望读取81位数字或点; 点和“ 0”都表示一个
空单元格,而数字1 ... 9描述一个已填充的单元格。 开始:
public boolean read(Reader r) {
int i= 0, j= 0; // the first position of the board
try {
// keep on reading characters:
for (int x; (x= r.read()) != -1; ) {
// skip it if not a digit nor a dot
if (!(Character.isDigit(x) || x == '.')) continue;
// is it a digit 1 ... 9?
if (!(x == '0' || x == '.'))
setValue(i, j, x-'0');
// position i,j at next position, return when done
if ((j= (j+1)%9) == 0)
if (++i == 9) return true;
}
}
catch (IOException ioe) { }
// something went wrong
return false;
}
下一组方法可以根据Writer打印电路板。
它打印
使用与示例板中所示格式相同的板
文章的第一部分:
// print a horizontal separator line
private void printHorizontal(PrintWriter p) {
p.println("+-------+-------+-------+");
}
// print a little vertical line
private void printVertical(PrintWriter p) {
p.print("| ");
}
// print the Sudoku board
public void print(Writer w) {
PrintWriter p= new PrintWriter(w);
for (int i= 0; i < rows.length; i++) {
if (i%3 == 0) printHorizontal(p);
for (int j= 0; j < columns.length; j++) {
if (j%3 == 0) printVertical(p);
p.print(board[i][j]+" ");
}
printVertical(p);
p.println();
}
printHorizontal(p);
p.flush();
}
请注意,读取方法和写入方法都不会关闭字符
溪流; Reader和Writer作为参数传入,因此
这些方法负责关闭流。 读取方法确实
捕获IOExceptions并简单地返回false; 来电者只知道
由于某种原因而无法读取板,即抛出IOException或
阅读器的内容未构成有效的主板配置。
现在,我们拥有操作数独板的所有原始方法:
测试并在板上的任何位置设置一个值,我们可以再次重置单元格,
可以初始化并给整个板子提供一个Reader,最后我们可以打印
数独板授予作家。
本文的第三部分也是最后一部分显示了实际的Sudoku求解器。 所有
上面显示的方法是“ Sudoku”类的一部分。 求解器方法也将
成为成员方法。 在本文的第三部分中见。
亲切的问候,
乔斯
数独博士1.5