Регистрация не е нужна, освен при създаване на тема в "Задача на седмицата".

Загниващи ябълки - C++

Загниващи ябълки - C++

Мнениеот Гост » 23 Окт 2021, 22:35

Ябълки са подредени в N реда и M стълба. Две от ябълките са гнили. От допира с тях след един ден и съседните им (отгоре, отдoу, вляво и вдясно) здрави също загниват. Напишете програма, която определя колко здрави ябълки ще останат след T дена.

Формат на входа:
От първия ред на стандартния вход за всеки пример са дадени N , M и T. От следващите два реда има по 2 числа -- ред и стълб, в които се намира гнила ябълка в първоначалния момент.

Ограничения:
0 < N <= M <= 1000
0 < T <= 100

Формат на изхода:
На отделен ред за всеки пример на стандартния изход да се изведе търсения брой здрави ябълки.

Примерен вход 1:
8 10 2
4 8
2 7
Примерен изход 1:
59

Примерен вход2:
3 3 1
1 2
3 2
Примерен изход 2:
2

Примерен вход 3:
1 203 100
1 1
1 203
Примерен изход3:
1

Задачката е хубава, но нещо не мога да я доизмисля. Това съм постигнала досега, като имам проблеми :
-понякога загнила ябълка в края на реда заразява тази от началото на следващия ред
-не съм сигурна как след като отбележа, че една ябълка ще бъде развалена на следващия ден, без да се получи погрешно тълкуване, че ябълката е развалена от предишния ден. Примерно при съседна на гнила ябълка
-обърквам се кое е ред кое колона , как задавам координатната система


Код: Избери целия код
 #include <iostream>

using namespace std;

//position safe is position inside the array
bool issafe(int i = 1, int j = 1, int R = 1, int C = 1)
{
    if (i >= 1 && j <= R && j >= 1 && i <= C    )
        return true;
    return false;
}

int main()
{
cout << "rows and cols: "  << endl;
int R, C;
cin >> R >> C;

cout << "days: " << endl;
int days;
cin>> days;

cout << "x1, y1: " << endl;
int x1, y1;
cin >> x1 >> y1;

cout << "x2, y2: " << endl;
int x2, y2;
cin >> x2 >> y2;


// 0 -> ok apple
// 1 -> rotten apple ( just rotten)
// 2 -> already rotten apple (all adjacent(left, right, bottom , top) elements had already been considered)
//3 - > new rotten (will be rotten next)



int v[R][C] ;

 //all apples ok
for(int i = 1 ; i <= R ; i++)
    for(int j = 1; j <= C; j++)
    v[i][j] = 0;


// 2 rotten apples
v[x1][y1] = 1;
v[x2][y2] = 1;


cout << "before:" << endl;
for(int i = 1; i <= C; i++)
        {
            for(int j = 1 ; j <= R; j++)
                {cout << v[i][j] << "    ";
                }
                cout << endl;
        }

        cout << "after: " << endl;

    for(int k = 0 ; k < days ; k++){  //every day
   
   
    //rotting apples
     for (int i = 1; i <= C; i++) {
            for (int j = 1; j <= R; j++) {

                // (i+1, j), (i, j-1), (i, j+1), (i-1, j)
                if (v[i][j] == 1) { // if is just rotten



                    if (issafe(i + 1, j, R, C) && v[i + 1][j] == 0) {
                        v[i + 1][j] = 3; // future rotten
                    }
                    if (issafe(i, j + 1, R, C) && v[i][j + 1] == 0) {
                        v[i][j + 1] =  3;

                    }
                    if (issafe(i - 1, j, R, C) && v[i - 1][j] == 0) {
                        v[i - 1][j] = 3;

                    }
                    if (issafe(i, j - 1, R, C) && v[i][j - 1] == 0) {
                        v[i][j - 1] = 3;
                    }

                    v[i][j] = 2; //already rotten
                }
                // tturn all 3s to 2s but were and how???
            }



    }//end of rotting apples

     } // end of days


    int ok = R * C ;
     for(int i = 1; i <= C; i++)
        {
            for(int j = 1 ; j <= R; j++)
                {
                    cout << v[i][j] << "    ";
                if(v[i][j] !=0)  // maybe (v[i][j] !=3)) too
                    ok--;
                }
            cout << endl;
        }
    cout << endl << endl << endl << "ok = " << ok  ;

    return 0;
}
Гост
 

Назад към C, C++



Кой е на линия

Регистрирани потребители: Google Adsense [Bot], Google [Bot]

Форум за математика(архив)