The way I translate the Java's continue label is not "ruby way".
The java's continue label is like:
static void ShowAllAns() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (puzzle[i][j] <= 0) {
next_value: for (int value = 1; value <= 9; value++) {
// On the same column, make sure no any row already used it
// On the same row, make sure no any column already used it
for (int k = 0; k < 9; k++) {
if ((puzzle[k][j] == value) || (puzzle[i][k] == value)) {
continue next_value; // continue with label
}
}
// On the 3x3 box, make sure no other cell already used it
int p = (i / 3) * 3;
int q = (j / 3) * 3;
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 3; y++) {
if (puzzle[p+x][q+y] == value) {
continue next_value; // continue with label
}
}
}
puzzle[i][j] = value;
ShowAllAns();
puzzle[i][j] = 0;
}
return; // tried all possible value, just return
}
}
}
PrintPuzzle();
}
----------------------------
I translated like :
def solve
9.times do |row|
9.times do |col|
next if @ary[row][col]
# find next possible value for @ary[row][col]
1.upto(9) do |v|
# check on same row/col, no any col/row already used it
next unless 9.times { |i| break if @ary[i][col] == v ||
@ary[row][i] ==v }
# check on 3x3 box, no other cell already used it
next unless 3.times do |i|
break unless 3.times do |j|
break if @ary[i + row / 3 * 3][j + col / 3 * 3] == v
end
end
@ary[row][col] = v
if solve
return true
else
@ary[row][col] = nil # backtracking
end
end
return false
end
end
true
end
-------------------------------
Using too many breaks to simulate Java's continue label...
I almost forget Ruby's throw-catch.
I think translate Java's continue label the "Ruby" way maybe like this:
def solve
9.times do |row|
9.times do |col|
next if @ary[row][col]
# find next possible value for @ary[row][col]
1.upto(9) do |v|
catch :next do
# check on same row/col, no any col/row already used it
9.times { |i| throw :next if @ary[i][col] == v || @ary[row][i] ==v }
# check on 3x3 box, no other cell already used it
3.times do |i|
3.times do |j|
throw :next if @ary[i + row / 3 * 3][j + col / 3 * 3] == v
end
end
@ary[row][col] = v
if solve
return true
else
@ary[row][col] = nil # backtracking
end
end
end
return false
end
end
true
end