Bruteforce, C++, unspektakulär
Code:
#include <iostream>
const int K = 3; //Kasten
const int D = K*K; //Seitenlaenge
short feld[D][D];
inline bool test(int x, int y)
{
for(int i = 0; i< D; i++)
{
if( ((feld[x][y] == feld[i][y]) && (x!=i)) || ((feld[x][y] == feld[x][i]) && (y!=i)) ) return false;
}
for(int ix = (x/K) *K; ix < (x/K+1)*K; ix++)
for(int iy = (y/K) *K; iy < (y/K+1)*K; iy++)
if(ix != x && iy != y && feld[x][y] == feld[ix][iy]) return false;
}
bool fill(int x, int y)
{
if(y == D)
return true;
if(feld[x][y] == 0)
{
for(int i = 1; i < D+1; i++)
{
feld[x][y] = i;
if(test(x,y))
if(fill((x+1)%D, y+(x+1)/D)) return true;
}
feld[x][y] = 0;
return false;
}
else
return test(x,y) ? fill((x+1)%D, y+(x+1)/D) : false;
}
void main()
{
std::cout << "\n \n Zahl fuer Zahl (Zeilenweise; 0 = frei):\n";
for(int iy = 0; iy < D; iy++)
for(int ix = 0; ix < D; ix++)
std::cin >> feld[ix][iy];
if(fill(0,0))
for(int iy = 0; iy < D; iy++)
{
std::cout << "\n";
if(iy%K == 0) std::cout << "\n";
for(int ix = 0; ix < D; ix++)
{
if(ix%K == 0) std::cout << " ";
std::cout << feld[ix][iy] << " ";
}
}
else
std::cout << "Es sind Unstimmigkeiten in der Vorgabe.";
std::cout << "\n";
std::cin >> feld[0][0];
} mfg fish