Re: Solver
Posted: Thursday 18. November 2010, 13:21
Ich habe die Fehler gefunden. Hier ist der neue Code in C':
private bool notStr8t(int row, int col)
{
int i, iR=-1, iC=-1;
for (i = 0; i < RSnum; i++) // find Index of Street in Row
if (row == RStreet[i, 0] && col >= RStreet[i, 1] &&
col < RStreet[i, 2])
{ iR = i; break; }
if (iR >= 0) if (col == RStreet[iR, 2] -1)
if (checkStr8t(true, row, iR)) return (true); // no Street
for (i = 0; i < CSnum; i++) // find Index of Street in Col
if (col == CStreet[i, 0] && row >= CStreet[i, 1] &&
row < CStreet[i, 2]) { iC = i; break; }
if (iC >= 0) if (row == CStreet[iC, 2] - 1)
if (checkStr8t(false, col, iC)) return (true); // no Street
return (false); // means: it is a legal Street
}
private bool checkStr8t(bool Rows, int RC, int iRC)
{
int i, j, i1, anf, sAnf, sEnd, len;
bool[] seq = new bool[18];
for (i = 0; i < 18; i++) seq = false; // clear seq
if (Rows) {sEnd = RStreet[iRC, 2]; sAnf = RStreet[iRC, 1];}
else {sEnd = CStreet[iRC, 2]; sAnf = CStreet[iRC, 1];}
len = sEnd - sAnf;
for (j = sAnf; j < sEnd; j++) // Set the Sequence Matrix
{
if (Rows) i1 = Math.Abs(f[RC, j]); else i1 = Math.Abs(f[j, RC]);
seq[i1] = true;
}
anf = 0;
for (j = 1; j < 10; j++) if (seq[j]) { anf = j; break; } // Find Start
for (j = anf; j < anf + len; j++) if (!seq[j]) return (true); // Found Hole
if (!DEBUGstr8ts) return (false);
nDEBUGstr++; tws.Write(nDEBUGstr); tws.Write(';');
if (Rows)
{
for (i = 0; i < iRC; i++) tws.Write(';');
for (j = RStreet[iRC, 1]; j < RStreet[iRC,2]; j++)
tws.Write(Math.Abs(f[RStreet[iRC, 0], j]));
tws.Write(';');
}
else
{
for (i = 0; i < RSnum; i++) tws.Write(';');
for (i = 0; i < iRC; i++) tws.Write(';');
for (j = CStreet[iRC, 1]; j < CStreet[iRC, 2]; j++)
tws.Write(Math.Abs(f[j, CStreet[iRC, 0]]));
tws.Write(';');
}
tws.WriteLine();
return (false);
}
private void iterate(int row, int col)
{
int i1, j; bool vorhanden;
for (i1 = 1; i1 < 10; i1++) // new Digit
{
if (f[row, col] < 0) i1 = -f[row, col]; // Block or Preset
if (i1 != 10) // not Block
{
vorhanden = false; // Rows unique?
for (j = row - 1; j >= 0; j--)
if (i1 == Math.Abs(f[j, col]))
{ vorhanden = true; break; }
for (j = row + 1; j < 9; j++)
if (i1 == -f[j, col])
{ vorhanden = true; break; }
if (vorhanden)
{
if (i1 == 9) f[row, col] = 11;
if (f[row, col] < 0) i1 = 9;
continue;
}
vorhanden = false; // Cols unique?
for (j = col - 1; j >= 0; j--)
if (i1 == Math.Abs(f[row, j]))
{ vorhanden = true; break; }
for (j = col + 1; j < 9; j++)
if (i1 == -f[row, j])
{ vorhanden = true; break; }
if (vorhanden)
{
if (i1 == 9) f[row, col] = 11;
if (f[row, col] < 0) i1 = 9;
continue;
}
if (f[row, col] >= 0) f[row, col] = i1; // Set the Test-Digit
else i1 = 9; // Preset
if (DEBUG) fToFeld();
if (notStr8t(row, col)) // no Hole in Street?
{ if (f[row, col] >= 0) f[row, col] = 11; continue; }
}
if (!CFIRST)
{
if (col < 8) iterate(row, col + 1); //recursive
if (row < 8) iterate(row + 1, 0); //recursive
}
else
{
if (row < 8) iterate(row + 1, col); //recursive
if (col < 8) iterate(0, col + 1); //recursive
}
if (row < 8 || col < 8)
{
if (nSol > 0) break;
if (f[row, col] < 0) i1 = 9; // Preset
else if (i1 == 9) f[row, col] = 11; // Marker for Debugging
continue;
}
fToFeld(); nSol++; return; // found Solution
}
}
private bool notStr8t(int row, int col)
{
int i, iR=-1, iC=-1;
for (i = 0; i < RSnum; i++) // find Index of Street in Row
if (row == RStreet[i, 0] && col >= RStreet[i, 1] &&
col < RStreet[i, 2])
{ iR = i; break; }
if (iR >= 0) if (col == RStreet[iR, 2] -1)
if (checkStr8t(true, row, iR)) return (true); // no Street
for (i = 0; i < CSnum; i++) // find Index of Street in Col
if (col == CStreet[i, 0] && row >= CStreet[i, 1] &&
row < CStreet[i, 2]) { iC = i; break; }
if (iC >= 0) if (row == CStreet[iC, 2] - 1)
if (checkStr8t(false, col, iC)) return (true); // no Street
return (false); // means: it is a legal Street
}
private bool checkStr8t(bool Rows, int RC, int iRC)
{
int i, j, i1, anf, sAnf, sEnd, len;
bool[] seq = new bool[18];
for (i = 0; i < 18; i++) seq = false; // clear seq
if (Rows) {sEnd = RStreet[iRC, 2]; sAnf = RStreet[iRC, 1];}
else {sEnd = CStreet[iRC, 2]; sAnf = CStreet[iRC, 1];}
len = sEnd - sAnf;
for (j = sAnf; j < sEnd; j++) // Set the Sequence Matrix
{
if (Rows) i1 = Math.Abs(f[RC, j]); else i1 = Math.Abs(f[j, RC]);
seq[i1] = true;
}
anf = 0;
for (j = 1; j < 10; j++) if (seq[j]) { anf = j; break; } // Find Start
for (j = anf; j < anf + len; j++) if (!seq[j]) return (true); // Found Hole
if (!DEBUGstr8ts) return (false);
nDEBUGstr++; tws.Write(nDEBUGstr); tws.Write(';');
if (Rows)
{
for (i = 0; i < iRC; i++) tws.Write(';');
for (j = RStreet[iRC, 1]; j < RStreet[iRC,2]; j++)
tws.Write(Math.Abs(f[RStreet[iRC, 0], j]));
tws.Write(';');
}
else
{
for (i = 0; i < RSnum; i++) tws.Write(';');
for (i = 0; i < iRC; i++) tws.Write(';');
for (j = CStreet[iRC, 1]; j < CStreet[iRC, 2]; j++)
tws.Write(Math.Abs(f[j, CStreet[iRC, 0]]));
tws.Write(';');
}
tws.WriteLine();
return (false);
}
private void iterate(int row, int col)
{
int i1, j; bool vorhanden;
for (i1 = 1; i1 < 10; i1++) // new Digit
{
if (f[row, col] < 0) i1 = -f[row, col]; // Block or Preset
if (i1 != 10) // not Block
{
vorhanden = false; // Rows unique?
for (j = row - 1; j >= 0; j--)
if (i1 == Math.Abs(f[j, col]))
{ vorhanden = true; break; }
for (j = row + 1; j < 9; j++)
if (i1 == -f[j, col])
{ vorhanden = true; break; }
if (vorhanden)
{
if (i1 == 9) f[row, col] = 11;
if (f[row, col] < 0) i1 = 9;
continue;
}
vorhanden = false; // Cols unique?
for (j = col - 1; j >= 0; j--)
if (i1 == Math.Abs(f[row, j]))
{ vorhanden = true; break; }
for (j = col + 1; j < 9; j++)
if (i1 == -f[row, j])
{ vorhanden = true; break; }
if (vorhanden)
{
if (i1 == 9) f[row, col] = 11;
if (f[row, col] < 0) i1 = 9;
continue;
}
if (f[row, col] >= 0) f[row, col] = i1; // Set the Test-Digit
else i1 = 9; // Preset
if (DEBUG) fToFeld();
if (notStr8t(row, col)) // no Hole in Street?
{ if (f[row, col] >= 0) f[row, col] = 11; continue; }
}
if (!CFIRST)
{
if (col < 8) iterate(row, col + 1); //recursive
if (row < 8) iterate(row + 1, 0); //recursive
}
else
{
if (row < 8) iterate(row + 1, col); //recursive
if (col < 8) iterate(0, col + 1); //recursive
}
if (row < 8 || col < 8)
{
if (nSol > 0) break;
if (f[row, col] < 0) i1 = 9; // Preset
else if (i1 == 9) f[row, col] = 11; // Marker for Debugging
continue;
}
fToFeld(); nSol++; return; // found Solution
}
}