Перевод с С++ на Си

Только недавно начала изучать си, помогите, пожалуйста, перевести с С++ на Си. Условие: На листке в клетку размером 10 × 10 выбрали какую-то клетку и, начиная от нее, стали закрашивать подряд клетки, двигаясь только вниз и вправо. Затем первую и последнюю закрашенную клетку стерли. Ваша задача — восстановить их. Если вариантов ответа несколько, выведите любой.

Формат входного файла Входные данные состоят из 10 строк, содержащих по 10 чисел 0 и 1. Число 0 означает незакрашенную клетку, а 1 — закрашенную. Формат выходных данных Выведите изображение листка в том же формате, что и во входных данных, только с добавлением первой и последней покрашенных клеток.

#include <iostream>
#include <cmath>
#include <vector>
#include <cstdio>
#include <string>
#include <iomanip>
#include <algorithm>
using namespace std;
 
int main() {
    vector <vector <int> > a(10, vector <int>(10));
    pair <int, int> b[2];
    bool flag = true;
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cin >> a[i][j];
            if (a[i][j] == 1 && flag) {
                b[0].first = i; b[0].second = j;
                flag = false;
            }
            if (a[i][j] == 1) {
                b[1].first = i; b[1].second = j;
            }
        }
    }
    if (b[0].first > 0) {
        a[b[0].first - 1][b[0].second] = 1;
    }
    else {
        a[b[0].first][b[0].second - 1] = 1;
    }
    if (b[1].first < 9) {
        a[b[1].first + 1][b[1].second] = 1;
    }
    else {
        a[b[1].first][b[1].second + 1] = 1;
    }
    for (int i = 0; i < 10; i++) {
        cout << a[i][0];
        for (int j = 1; j < 10; j++) {
            cout << ' ' << a[i][j];
        }
        cout << endl;
    }
    return 0;
}

Код работает верно, помогите с переводом на си.

#include <stdbool.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main() {
    vector <vector <int> > a(10, vector <int>(10));
    pair <int, int> b[2];
    bool flag = true;
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            scanf("%d", a[i][j]);
            if (a[i][j] == 1 && flag) {
                b[0].first = i; b[0].second = j;
                flag = false;
            }
            if (a[i][j] == 1) {
                b[1].first = i; b[1].second = j;
            }
        }
    }
    if (b[0].first > 0) {
        a[b[0].first - 1][b[0].second] = 1;
    }
    else {
        a[b[0].first][b[0].second - 1] = 1;
    }
    if (b[1].first < 9) {
        a[b[1].first + 1][b[1].second] = 1;
    }
    else {
        a[b[1].first][b[1].second + 1] = 1;
    }
    for (int i = 0; i < 10; i++) {
        printf("%d", a[i][0]);
        for (int j = 1; j < 10; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

Я частично перевела, но не до конца понимаю, как оформить


Ответы (1 шт):

Автор решения: Павел Ериков

Аналога vector и pair в си лично я не знаю, но они вам в этой задачи и не нужны.

Я заметил, что создавая матрицу через vector<vector<int>> вы не использовали никаких дополнительных функций по типу push_back и т.д. И по условию задачи размерность матрицы не изменяется.

Значит можно использовать самый обычный статический массив:

int arr[10][10];

И на строчке

scanf("%d", a[i][j]);

Перед a[i][j] нужно добавить & :)

Теперь насчет pair. Можно реализовать двумя способами:

  1. Просто сделать статический массив из 4-х элементов, и в самом коде писать не b[0].first, а b[0], не b[1].second, а b[3].

  2. Или можно написать самому структуру cpair.

    Например так:

    struct cpair {
        int first;
        int second;
    };
    

    И аналогично коду на c++ сделать статический массив из 2 элементов типа cpair.

    struct cpair b[2];
    

    И тогда в самом коде ничего связанного с b можно не менять.

→ Ссылка