Kun po sachovnici - Toroid...... nevim co s tim pomoc – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kun po sachovnici - Toroid...... nevim co s tim pomoc – C / C++ – Fórum – Programujte.comKun po sachovnici - Toroid...... nevim co s tim pomoc – C / C++ – Fórum – Programujte.com

 

Dave-CZ0
Návštěvník
11. 12. 2009   #1
-
0
-

Hoy lidi potreboval bych pomoct mam program Kun ktery se pohybuje po sachovnici, ale musim to udelat aby se pohyboval pomoci pravidla Toroidu...... vím jak by to melo fungovat mely by se prepocitat hodnoty ale nevim jak a kde fto mam dat... a nevim ani jak by funkce mela vypadat... pomohl by mi nekdo? zde je kod programu kdy se pohybuje po sachovnici



#include <stdio.h>

// velikost sachovnice
const int BoardSize = 8;

// deklarace typu sachovnice
typedef int tBoard[BoardSize][BoardSize];

// pocet moznych tahu konem
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 konem po sachovnici
// Pos -- aktualni poloha kone na sachovnici
// MoveIndex -- kolikaty z 8 moznych tahu provadime
// Funkce vraci novou polohu kone
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 zda 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 == 1+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);
Board[InitPos.Row][InitPos.Col] = 1;
bool HasSolution = Horse(Board, InitPos, 2);
if (HasSolution)
{
PrintBoard(Board);
}
else
{
printf ("Reseni nenalezeno!\n");
}
}



Diky vsem za jakoukoliv pomoct a dekuju mejte se

Nahlásit jako SPAM
IP: 212.47.23.–
liborb
~ Redaktor
+18
Guru
12. 12. 2009   #2
-
0
-

To se tu před nedávnem řešilo, podívej se několik témat nazpátek. Pokud to z toho nepochopíš, tak se zase ozvi - nejlépe s konkrétním dotazem.

Nahlásit jako SPAM
IP: 91.203.96.–
Dave-CZ0
Návštěvník
12. 12. 2009   #3
-
0
-

To liborb :

Zdravim.... Chtěl bych se zeptat jestli je tento kod dobre, zda se mi ze to je dobre ale je to dobre??



Position Move(const Position& Pos, const int MoveIndex)
{
Position p;
p.Row = Pos.Row + RowMoveDelta[MoveIndex];
p.Col = Pos.Col + ColMoveDelta[MoveIndex];

if (p.Row >= BoardSize)
p.Row -= BoardSize;

if (p.Col >= BoardSize)
p.Col -= BoardSize;

if (p.Row < 0)
p.Row += BoardSize;

if (p.Col < 0)
p.Col += BoardSize;
return p;
}


diky za kontrolu

Nahlásit jako SPAM
IP: 212.47.23.–
liborb
~ Redaktor
+18
Guru
13. 12. 2009   #4
-
0
-

Vypadá, že je to dobře.

Nahlásit jako SPAM
IP: 91.203.96.–
Dave-CZ0
Návštěvník
13. 12. 2009   #5
-
0
-

Takze takto to je cele dokupy fungovat to funguje ale par vecem nerozumim...



#include <stdio.h>


// velikost sachovnice
const int N = 8;

// deklarace typu sachovnice
typedef int tBoard[N][N];

// pocet moznych tahu konem
const int NoOfHorseMoves = 8;

// zmeny souradnic pro jednotlive tahy
const int RadekMoveDelta[NoOfHorseMoves] = {-2, -1, +1, +2, +2, +1, -1, -2};
const int SloupecMoveDelta[NoOfHorseMoves] = {+1, +2, +2, +1, -1, -2, -2, -1};

// deklarace typu pro ulozeni pozice
struct Position
{
int Radek;
int Sloupec;
};

// inicializace sachovnice
void InitBoard(tBoard& Board)
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
Board[i][j] = 0;
}

// zobrazeni sachovnice
void PrintBoard(const tBoard& Board)
{
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
printf ("%4i", Board[i][j]);
printf ("\n");
}
printf ("\n");
}

// posun konem po sachovnici
// Pos -- aktualni poloha kone na sachovnici
// MoveIndex -- kolikaty z 8 moznych tahu provadime
// Funkce vraci novou polohu kone
Position Move(const Position & Pos, const int MoveIndex)
{
Position p;
p.Radek = Pos.Radek + RadekMoveDelta[MoveIndex];
p.Sloupec = Pos.Sloupec + SloupecMoveDelta[MoveIndex];

if (p.Radek >= N)
p.Radek -= N;
if (p.Sloupec >= N)
p.Sloupec -= N;
if (p.Radek < 0)
p.Radek += N;
if (p.Sloupec < 0)
p.Sloupec += N;

return p;
}

// Test zda 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 &= Board[Pos.Radek][Pos.Sloupec] == 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 == N*N)
return true;

for (int i=0; i<NoOfHorseMoves; i++)
{
Position p = Move(CurrentPos, i);
if (IsValidMove(p, Board))
{
Board[p.Radek][p.Sloupec] = MoveNumber;
if (Horse(Board, p, MoveNumber+1))
return true;
else
Board[p.Radek][p.Sloupec] = 0;
}
}
return false ;
}

void main()
{
tBoard Board;
Position InitPos = {0,0};
InitBoard (Board);
Board[InitPos.Radek][InitPos.Sloupec] = 1;
bool HasSolution = Horse(Board, InitPos, 1);
if (HasSolution)
{
PrintBoard(Board);
}
else
{
printf ("Reseni nenalezeno!\n");
}
}


Snad na to prijdu proc jsem to tam dal :-D

Nahlásit jako SPAM
IP: 212.47.23.–
Dave-CZ0
Návštěvník
14. 12. 2009   #6
-
0
-

a jakym stylem se resilo to ve foru:
http://programujte.com/?akce=diskuze&kam=vlakno&tema=14126-pohyb-kone-po-toroidu

???
Co se měnilo v: IsValidMove? at jsem trosku v obraze pac ja v teto funkci jen neco dal pryc a pridal do: Position Move

Nahlásit jako SPAM
IP: 212.47.23.–
liborb
~ Redaktor
+18
Guru
14. 12. 2009   #7
-
0
-

Upravit to lze více způsoby, a ty sis vybral jeden z nich. V odkazovaném vláknu se diskutovala jiná možnost.

Nahlásit jako SPAM
IP: 85.207.166.–
Chudda0
Duch
16. 12. 2009   #8
-
0
-

vysvetlil by mi nekdo tu funkci



Position Move(const Position & Pos, const int MoveIndex)

{

Position p;

p.Radek = Pos.Radek + RadekMoveDelta[MoveIndex];

p.Sloupec = Pos.Sloupec + SloupecMoveDelta[MoveIndex];



if (p.Radek >= N)

p.Radek -= N;

if (p.Sloupec >= N)

p.Sloupec -= N;

if (p.Radek < 0)

p.Radek += N;

if (p.Sloupec < 0)

p.Sloupec += N;



return p;



a

proc je tam to Position&(tento znak nechapu) Pos


diky za odpopved

Nahlásit jako SPAM
IP: 158.196.66.–
liborb
~ Redaktor
+18
Guru
16. 12. 2009   #9
-
0
-

To je funkce Move upravená pro toroid. Změní se pozice (dle pohybu koně) a pak se testuje, jestli kůň "neopustil šachovnici". Pokud ano, tak se pozice upraví, protože toriod je stočená šachovnice, a když jí na jednom konci "opustíš", tak se "vynoříš" na druhém konci (jako had ve stejnojmenné hře).

& - to je předávání parametru referencí.

Nahlásit jako SPAM
IP: 85.207.166.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Podobná vlákna

Error 207, zaboha nevim co s tim — založil fak.gesho

Co s tim ? — založil sdas

Kam s tím? — založil fujinos

Tim Burton — založil survik1

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý