C++ Bc. 40 cpp: Porovnání verzí
BUG !!! |
m typo v komentari |
||
(Nejsou zobrazeny 2 mezilehlé verze od stejného uživatele.) | |||
Řádek 133: | Řádek 133: | ||
std::cout << b << "/" << c << ": " | std::cout << b << "/" << c << ": " | ||
<< simulace(nexp, b, c) << " "; | << simulace(nexp, b, c) << " "; | ||
} | |||
std::cout << "\n"; | |||
} | |||
} | |||
</pre> | |||
Varianta s testem vzájemně se ohrožujících dam podle Jiřího Bartoše. | |||
<pre> | |||
#include <iostream> | |||
#include <cmath> | |||
#include <ctime> | |||
double r() { return rand()/(RAND_MAX + 1.0); } | |||
bool nahodne_postaveni(int bile, int cerne) | |||
{ | |||
enum {bila=1, cerna=2}; | |||
int sachovnice[8][8] = {{0}}; | |||
int pocet = 0; // pocet figur na sachovnici | |||
int radek [64]; // indexy radku/sloupcu figur na sachovnici | |||
int sloupec[64]; | |||
int pocet_barev[3]; // dve barvy indexovane od 1 | |||
pocet_barev[bila ] = bile; | |||
pocet_barev[cerna] = cerne; | |||
for (int barva=bila; barva<=cerna; barva++) | |||
for (int b=1; b<=pocet_barev[barva]; b++) | |||
{ | |||
int i; | |||
int j; | |||
do | |||
{ | |||
i = int( 8*r() ); | |||
j = int( 8*r() ); | |||
} | |||
while (sachovnice[i][j] != 0); | |||
sachovnice[i][j] = barva; | |||
radek[pocet] = i; | |||
sloupec[pocet] = j; | |||
pocet++; | |||
} | |||
for (int i=0; i<pocet; i++) | |||
{ | |||
const int ri = radek[i]; // index radku prvni damy | |||
const int si = sloupec[i]; // index sloupce | |||
const int bi = sachovnice[ri][si]; // barva prvni damy | |||
for (int j=i+1; j<pocet; j++) | |||
{ | |||
const int rj = radek[j]; // index radku druhe damy | |||
const int sj = sloupec[j]; // index sloupce | |||
if (bi != sachovnice[rj][sj]) // damy ruznych barev | |||
{ | |||
// stejne radky nebo sloupce ==> damy se vzajemne ohrozuji | |||
if (ri == rj || si == sj) return false; | |||
// damy na stejne hlavni, resp. vedlejsi, diagonale se ohrozuji | |||
if (std::abs(ri - rj) == std::abs(si - sj)) return false; | |||
} | |||
} | |||
} | |||
return true; | |||
} | |||
double simulace(int pokusy, int bile, int cerne) | |||
{ | |||
int priznive_jevy = 0; | |||
for (int i=0; i<pokusy; i++) | |||
if (nahodne_postaveni(bile, cerne)) | |||
priznive_jevy++; | |||
return double(priznive_jevy)/pokusy; | |||
} | |||
int main() | |||
{ | |||
std::cout.precision(2); | |||
std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield); | |||
const int nexp = 1000000; | |||
std::srand(std::time(0)); | |||
for (int b=1; b<=4; b++) | |||
{ | |||
for (int c=1; c<=b; c++) | |||
{ | |||
std::cout << b << "/" << c << ": " | |||
<< simulace(nexp, b, c) << " "; | |||
} | } | ||
std::cout << "\n"; | std::cout << "\n"; |
Aktuální verze z 25. 1. 2008, 16:06
#include <iostream> #include <cmath> #include <ctime> double r() { return rand()/(RAND_MAX + 1.0); } bool nahodne_postaveni(int bile, int cerne) { enum {bila=1, cerna=2}; int sachovnice[8][8] = {{0}}; for (int b=1; b<=bile; b++) { int i; int j; do { i = int( 8*r() ); j = int( 8*r() ); } while (sachovnice[i][j] != 0); sachovnice[i][j] = bila; } for (int c=1; c<=cerne; c++) { int i; int j; do { i = int( 8*r() ); j = int( 8*r() ); } while (sachovnice[i][j] != 0); sachovnice[i][j] = cerna; } for (int radek=0; radek<8; radek++) for (int sloupec=0; sloupec<8; sloupec++) if (const int barva = sachovnice[radek][sloupec]) { for (int s=sloupec+1; s<8; s++) // postaveni vpravo if (const int sousedni = sachovnice[radek][s]) if (barva != sousedni) return false; else break; for (int s=sloupec-1; s>=0; s--) // postaveni vlevo if (const int sousedni = sachovnice[radek][s]) if (barva != sousedni) return false; else break; for (int r=radek+1; r<8; r++) // postaveni nad if (const int sousedni = sachovnice[r][sloupec]) if (barva != sousedni) return false; else break; for (int r=radek-1; r>=0; r--) // postaveni pod if (const int sousedni = sachovnice[r][sloupec]) if (barva != sousedni) return false; else break; // diagonala vlevo nahoru for (int r=radek-1, s=sloupec-1; r>=0 && s>=0; r--, s--) if (const int sousedni = sachovnice[r][s]) if (barva != sousedni) return false; else break; // diagonala vpravo nahoru for (int r=radek-1, s=sloupec+1; r>=0 && s<8; r--, s++) if (const int sousedni = sachovnice[r][s]) if (barva != sousedni) return false; else break; // diagonala vlevo dolu for (int r=radek+1, s=sloupec-1; r<8 && s>=0; r++, s--) if (const int sousedni = sachovnice[r][s]) if (barva != sousedni) return false; else break; // diagonala vpravo dolu for (int r=radek+1, s=sloupec+1; r<8 && s<8; r++, s++) if (const int sousedni = sachovnice[r][s]) if (barva != sousedni) return false; else break; } return true; } double simulace(int pokusy, int bile, int cerne) { int priznive_jevy = 0; for (int i=0; i<pokusy; i++) if (nahodne_postaveni(bile, cerne)) priznive_jevy++; return double(priznive_jevy)/pokusy; } int main() { std::cout.precision(2); std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield); const int nexp = 1000000; std::srand(std::time(0)); for (int b=1; b<=4; b++) { for (int c=1; c<=b; c++) { std::cout << b << "/" << c << ": " << simulace(nexp, b, c) << " "; } std::cout << "\n"; } }
Varianta s testem vzájemně se ohrožujících dam podle Jiřího Bartoše.
#include <iostream> #include <cmath> #include <ctime> double r() { return rand()/(RAND_MAX + 1.0); } bool nahodne_postaveni(int bile, int cerne) { enum {bila=1, cerna=2}; int sachovnice[8][8] = {{0}}; int pocet = 0; // pocet figur na sachovnici int radek [64]; // indexy radku/sloupcu figur na sachovnici int sloupec[64]; int pocet_barev[3]; // dve barvy indexovane od 1 pocet_barev[bila ] = bile; pocet_barev[cerna] = cerne; for (int barva=bila; barva<=cerna; barva++) for (int b=1; b<=pocet_barev[barva]; b++) { int i; int j; do { i = int( 8*r() ); j = int( 8*r() ); } while (sachovnice[i][j] != 0); sachovnice[i][j] = barva; radek[pocet] = i; sloupec[pocet] = j; pocet++; } for (int i=0; i<pocet; i++) { const int ri = radek[i]; // index radku prvni damy const int si = sloupec[i]; // index sloupce const int bi = sachovnice[ri][si]; // barva prvni damy for (int j=i+1; j<pocet; j++) { const int rj = radek[j]; // index radku druhe damy const int sj = sloupec[j]; // index sloupce if (bi != sachovnice[rj][sj]) // damy ruznych barev { // stejne radky nebo sloupce ==> damy se vzajemne ohrozuji if (ri == rj || si == sj) return false; // damy na stejne hlavni, resp. vedlejsi, diagonale se ohrozuji if (std::abs(ri - rj) == std::abs(si - sj)) return false; } } } return true; } double simulace(int pokusy, int bile, int cerne) { int priznive_jevy = 0; for (int i=0; i<pokusy; i++) if (nahodne_postaveni(bile, cerne)) priznive_jevy++; return double(priznive_jevy)/pokusy; } int main() { std::cout.precision(2); std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield); const int nexp = 1000000; std::srand(std::time(0)); for (int b=1; b<=4; b++) { for (int c=1; c<=b; c++) { std::cout << b << "/" << c << ": " << simulace(nexp, b, c) << " "; } std::cout << "\n"; } }
[ Zpět ]