Я наблюдаю действительно странное поведение. Я почти уверен, что в моем коде есть ошибка, но поведение Eclipse настолько странно, что я ничего не могу понять.
Во-первых, здесь мой код: http://pastebin.com/JCaW53GM.
Я пытаюсь решить проблему Project Euler 96, т.е. Я пытаюсь построить решателя Sudoku, используя Knuth Dancing Links. После большой подготовки эта процедура должна решить проблему:
private static void search(int k) {
System.out.println("start search");
if (masterHeader.right == masterHeader) {
return;
}
// choose column
Column c = new Column("");
int s = Integer.MAX_VALUE;
for (Column j = (Column) masterHeader.right; j != masterHeader;
j = (Column) j.right) {
if (j.size < s) {
c = j;
s = j.size;
}
}
// dancing links
c.cover();
for (Datum r = c.bottom; r != c; r = r.bottom) {
o[k] = r;
for (Datum j = r.right; j != r; j = r.right) {
j.column.cover();
}
System.out.println("before calling search(" + k + " + 1)");
search(k + 1);
r = o[k];
c = r.column;
for (Datum j = r.left; j != r; j = j.left) {
j.uncover();
}
}
c.uncover();
}
Всякий раз, когда я запускаю программу, я получаю следующий вывод:
start search
before calling search(0 + 1)
start search
before calling search(1 + 1)
start search
before calling search(2 + 1)
start search
before calling search(3 + 1)
start search
before calling search(4 + 1)
start search
before calling search(5 + 1)
start search
before calling search(6 + 1)
start search
before calling search(7 + 1)
start search
before calling search(8 + 1)
start search
После этого ничего. Нет ошибки, нет переполнения, Eclipse просто продолжает работать вечно. Я вообще не понимаю, что это значит. Я почти уверен, что тот факт, что он останавливается при поиске (9), имеет какое-то отношение ко многим девяткам в моем коде. Но нет ошибки, и я в недоумении.
Кто-нибудь может просветить меня? Что хочет Eclipse? Что я сделал не так?
Изменить: Гааа! Я полностью забыл, что последний "начальный поиск" выхода. Это меня смутило. Полагаю, я просто слишком устал... во всяком случае, извините всех за то, что вы беспокоили вас. Да, это просто простой случай бесконечного цикла. Надеюсь, я смогу самостоятельно отладить это.
r != c;
это выражение, которое имеет смысл только в том случае, если вы говорите о том же экземпляре объекта. Так как r
и c
являются Datum
объектами, он не будет вычисляться true
, если они не являются точно такой же экземпляр.
То, что вы, вероятно, хотите сделать, это определить .equals
вместо этого в классе Datum
. Затем вы можете вызвать !r.equals(c)
.
Вы также можете переименовать эти переменные, так как row
и column
намного проще, чем r
и c
.