Potřebuju poradit, nevím si s tím rady, ale po šachovnici mám toto:
#include <stdio.h>
//nejmensi sachovnice musi byt 5
//nejvetsi sachovnice musi byt 8
//velikost sachovnice
const int BoardSize = 8;
//deklarace typu sachovnice
typedef int tBoard[BoardSize][BoardSize];
//pocet moznych tahu
const int NoOfHorseMoves = 8;
//zmeny souradnic pro jednotlive tahy
const int RowMoveDelta[NoOfHorseMoves] = {-2, -1, +1, +2, +2, +1, -1, -2};
const int ColMoveDelta[NoOfHorseMoves] = {+1, +2, +2, +1, -1, -2, -2, -1};
//deklarace typu pro ulozeni pozice
struct Position
{
int Row;
int Col;
};
//inicializace sachovnice
void InitBoard(tBoard& Board)
{
for(int i = 0; i < BoardSize; i++)
for(int j = 0; j < BoardSize; j++)
Board[i][j] = 0;
}
//zobrazeni sachovnice
void PrintBoard(const tBoard& Board)
{
for(int i = 0; i < BoardSize; i++)
{
for(int j = 0; j < BoardSize; j++)
printf("%4i", Board[i][j]);
printf("\n");
}
printf("\n");
}
//posun kone po sachovnici
Position Move(const Position& Pos, const int MoveIndex)
{
Position p;
p.Row = Pos.Row + RowMoveDelta[MoveIndex];
p.Col = Pos.Col + ColMoveDelta[MoveIndex];
return p;
}
//test zde je tah platny
//vraci true pokud je tah na pozici Pos na sachovnici dane parametrem Board mozny
bool IsValidMove(const Position& Pos, const tBoard Board)
{
bool Result = true;
Result &= 0 <= Pos.Row;
Result &= Pos.Row < BoardSize;
Result &= 0 <= Pos.Col;
Result &= Pos.Col < BoardSize;
Result &= Board[Pos.Row][Pos.Col] == 0;
return Result;
}
//rekurzivni hledani reseni problemu metoda backtracking
// Parametry:
// Board -- aktualni sachovnice, 0 znamena volne policko, cislo ruzne od 0 znamena poradi tahu kterym se sem kun dostal
// CurrentPos -- aktualni poloha kone
// MoveNumber -- poradi tahu, ktery provadime
// Funkce vraci true , pokud bylo nalezeno reseni
bool Horse(tBoard& Board, const Position& CurrentPos,
const int MoveNumber)
{
if (MoveNumber == BoardSize*BoardSize)
return true;
for(int i = 0; i < NoOfHorseMoves; i++)
{
Position p = Move(CurrentPos, i);
if (IsValidMove(p, Board))
{
Board[p.Row][p.Col] = MoveNumber;
if (Horse(Board, p, MoveNumber+1))
return true;
else
Board[p.Row][p.Col] = 0;
}
}
return false;
}
void main()
{
tBoard Board;
Position InitPos = {0,0};
InitBoard(Board);
bool HasSolution = Horse(Board, InitPos, 1);
if (HasSolution)
{
PrintBoard(Board);
}
else
{
printf("Reseni nenalezeno!\n");
}
}