Einzelnen Beitrag anzeigen
Alt 12.04.10, 19:09   #34 (permalink)
fishfishfish
 
Registriert seit: 27.07.09
fishfishfish Leistung: Facit NTK
Likes: 0
Standard

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
fishfishfish ist offline   Mit Zitat antworten
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61