//Погнали проверять
bool MyLovelyThread::CheckPANRow(int RowIndex)
{
int Sum[9];
for (int index = 0;index<10;index++) {Sum[index] = 0;}
for (int index = 0;index<9;index++) {Sum[gamepad[RowIndex][index]]++;}
for (int index = 1;index<10;index++) {if (Sum[index]>1){return false;}}
return true;
}
bool MyLovelyThread::CheckPANCol(int ColIndex)
{
int Sum[9];
for (int index = 0;index<10;index++) {Sum[index] = 0;}
for (int index = 0;index<9;index++) {Sum[gamepad[index][ColIndex]]++;}
for (int index = 1;index<10;index++) {if (Sum[index]>1){return false;}}
return true;
}
bool MyLovelyThread::CheckPANBlock(int RowIndex, int ColIndex)
{
int Sum[9];
for (int index = 0;index<10;index++) {Sum[index] = 0;}
for (int indexR = RowIndex;indexR<RowIndex+3;indexR++)
{
for (int indexC = ColIndex;indexC<ColIndex+3;indexC++)
{
Sum[gamepad[indexR][indexC]]++;
}
}
for (int index = 1;index<10;index++) {if (Sum[index]>1){return false;}}
return true;
}
bool MyLovelyThread::CheckPANRowZ()
{
for (int index = 0;index<9;index++) {if (CheckPANRow(index) == false) {return false;}}
return true;
}
bool MyLovelyThread::CheckPANColZ()
{
for (int index = 0;index<9;index++) {if (CheckPANCol(index) == false) {return false;}}
return true;
}
bool MyLovelyThread::CheckPANBlockZ()
{
for (int indexR = 0;indexR<3;indexR++)
{
for (int indexC = 0;indexC<3;indexC++)
{
if (CheckPANBlock(indexR*3,indexC*3) == false) {return false;}
}
}
return true;
}
bool MyLovelyThread::CheckPAN()
{
if (CheckPANBlockZ() == false)
{
return false;
}
else
{
if (CheckPANRowZ() == false)
{
return false;
}
else
{
if (CheckPANColZ() == false)
{
return false;
}
}
}
return true;
}
//Решить
bool MyLovelyThread::REVERS()
{
int indexR = 0;
int indexC = 0;
int index = 0;
bool FreeCell = false;
bool Result = false;
//Показать, что уже нарешалось
ShowMe();
while ((FreeCell == false)&&(indexR<9))
{
indexC = 0;
while ((FreeCell == false)&&(indexC<9)) {if (gamepad[indexR][indexC] == 0) {FreeCell = true;} else {indexC++;}}
if (FreeCell == false) {indexR++;}
}
if (FreeCell == false)
{
return true;
}
else
{
Result = false;
index = 1;
while ((Result == false)&&(index<10))
{
gamepad[indexR][indexC] = index;
if (CheckPAN()) {Result = REVERS();}
index++;
}
if (Result == false) {gamepad[indexR][indexC] = 0;}
}
return Result;
}
Что здесь не так?
По результатам исследований, функция bool MyLovelyThread::CheckPANRow(int RowIndex)
вызывается бесконечно, из-за того, что вызывающая ее
bool MyLovelyThread::CheckPANRowZ()
{
for (int index = 0;index<9;index++) {if (CheckPANRow(index) == false) {return false;}}
return true;
}
Впадает в бесконечный цикл. Qt и C++ взрывают мне моск. Как можно зависнуть в двух строчках кода?
Пользователь решил продолжить мысль 14 Сентября 2010, 15:08:32:
На JavaScript, Delphi, VBA этот алгоритм не вызывает проблем.