Cod sursa(job #917276)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 17 martie 2013 16:01:16
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>

using namespace std;

ifstream fin("cobai.in");
ofstream fout("cobai.out");

short int n, m, a[55][55], linie, coloana;
char dir[1011];
double fav, posibil;
short int l[400000], c[400000];

void Citire(){
    fin>>n>>m;
    fin.get();
    char x;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            fin.get(x);
            if(x == '+') a[i][j] = -1;
            else if(x == '*') a[i][j] = -1, linie = i, coloana = j;
            else posibil++;
        }
        fin.get();
    }
    fin.getline(dir, 1005);
}

void Bordare(){
    for(int i=0; i<=n+1; i++)
        a[i][0] = a[i][m+1] = -1;
    for(int j=0; j<=m+1; j++)
        a[0][j] = a[n+1][j] = -1;
}

void Afisare(){
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++)
            fout<<setw(2)<<a[i][j]<<" ";
        fout<<endl;
    }
}

void Parcurgere(){
    int st=1, dr=1, k1, k2, poz = 0, prim = 1;
    l[dr] = linie, c[dr] = coloana;
    while(poz < strlen(dir)){

        st = prim;

        if(dir[poz] == 'N') k1 = -1, k2 = 0;
        else if(dir[poz] == 'S') k1 = 1, k2 = 0;
        else if(dir[poz] == 'E') k1 = 0, k2 = 1;
        else if(dir[poz] == 'V') k1 = 0, k2 = -1;

        int x=1;

        while(st<=dr){
            int i = l[st], j = c[st];
            int ii = i + k1, jj = j + k2;
            if(poz+1 > a[ii][jj] && a[ii][jj] != -1){
                dr++;
                if(x) prim = dr, x = 0;
                l[dr] = ii, c[dr] = jj;
                a[ii][jj] = poz+1;
                if(poz == strlen(dir)-1) fav++;
            }
            st++;
        }
        poz++;
    }
}

int main()
{
    Citire();
    Bordare();
    Parcurgere();
    double rez = (fav*100)/posibil;
    fout<<setprecision(6)<<fixed<<rez;
    //Afisare();
    return 0;
}