Перевод с С++ на Си
Только недавно начала изучать си, помогите, пожалуйста, перевести с С++ на Си. Условие: На листке в клетку размером 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. Можно реализовать двумя способами:
Просто сделать статический массив из 4-х элементов, и в самом коде писать не
b[0].first, аb[0], неb[1].second, аb[3].Или можно написать самому структуру
cpair.Например так:
struct cpair { int first; int second; };И аналогично коду на
c++сделать статический массив из 2 элементов типаcpair.struct cpair b[2];И тогда в самом коде ничего связанного с
bможно не менять.