Zrobiłem to zadanie: http://pl.spoj.com/problems/ETI07E4/
Moim zdaniem jest wszystko ok, ale sprawdzarka mówi że niby dla jakiegoś przykładu wypisuje zła wartość. Mógłby ktoś podać jakiś przykład dla któregoś złą wartość wypisze?
Wiem że nie powinienem dawać kodu, więc JEŻELI KTOŚ ZAMIERZA TO ZADANIE ROBIĆ NIECH PO PROSTU NIE PATRZY DALEJ.
#include <bits/stdc++.h>
#define REP(i, n) for(int i = 0; i < n; i++)
using namespace std;
struct Position
{
public:
int x;
int y;
Position(){}
Position(int x, int y)
{
this->x = x;
this->y = y;
}
};
vector<vector<char> > mapa;
double wejsciaDoJedynek = 0, wejsciaDoDwojek = 0, WejsciaDoTrojek = 0;
int x, y;
void symulacja(Position posKulki, double szansa)
{
while(true)
{
if(posKulki.y+1 >= y)
{
break;
}
if(mapa[posKulki.x][posKulki.y+1]!='x')
{
posKulki.y++;
if(mapa[posKulki.x][posKulki.y] == '1')
wejsciaDoJedynek+=szansa;
if(mapa[posKulki.x][posKulki.y] == '2')
wejsciaDoDwojek+= szansa;
if(mapa[posKulki.x][posKulki.y] == '3')
WejsciaDoTrojek+=szansa;
}
else
{
bool czySymulowacLewo = false, czySymulowacPrawo = false;
bool czyPoszloWLewo = true, czyPoszoWPrawo = true;
if(posKulki.x >=1)
{
if(mapa[posKulki.x-1][posKulki.y] != 'x')
{
czySymulowacLewo = true;
}
else
czyPoszloWLewo = false;
}
if(posKulki.x <= x-2)
{
if(mapa[posKulki.x+1][posKulki.y] != 'x')
{
czySymulowacPrawo = true;
}
else
czyPoszoWPrawo = false;
}
if(czyPoszloWLewo && czyPoszoWPrawo)
szansa /= 2;
if(czySymulowacLewo)
symulacja(Position(posKulki.x-1, posKulki.y), szansa);
if(czySymulowacPrawo)
symulacja(Position(posKulki.x+1, posKulki.y), szansa);
break;
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin >> y >> x;
mapa.assign(x, vector<char>(y));
Position posKulki;
REP(j, y)
{
REP(i, x)
{
cin >> mapa[i][j];
if(mapa[i][j] == '*')
posKulki = Position(i, j);
}
}
symulacja(posKulki, 1);
cout << wejsciaDoJedynek << '\n';
cout << wejsciaDoDwojek<< '\n';
cout << WejsciaDoTrojek << '\n';
return 0;
}