Чтение строк в 2d массив символов с помощью cin в C++
Эта проблема основана на вопрос от CodeForces.
Здесь для получения входных данных используется подход, показанный ниже, который используется в модельном решении;
Пример ввода данных,
...... X.X.X. .X.X.X X.X.X. .X.X.X ......
Используемый код,
#define N 510 char a[N][N]; for (int i = 1; i <= n; i++){ scanf("%s", a[i] + 1); }
Моя проблема:
Почему?
a[i] + 1
используется в scanf("%s", a[i] + 1);
?. Почему там добавляется 1?Полное решение показано ниже. Источник.
#include <bits/stdc++.h> #define N 510 using namespace std; char a[N][N]; int n; int main(){ scanf("%d", &n); for (int i = 1; i <= n; i++){ scanf("%s", a[i] + 1); } int ans = 0; for (int i = 2; i < n; i++){ for (int j = 2; j < n; j++){ if (a[i][j] == 'X' && a[i - 1][j - 1] == 'X' && a[i - 1][j + 1] == 'X' && a[i + 1][j - 1] == 'X' && a[i + 1][j + 1] == 'X'){ ans ++; } } } printf("%d\n", ans); return 0; }
Что я уже пробовал:
int n; cin >> n; if(n<3){ cout << "0"; return 0; } char mat[510][510]; ll out = 0; FOR(i,0,n){ FOR(j,0,n){ int x; cin >> x; mat[i][j] = (char)x; } } FOR(i,1,n-1){ FOR(j,1,n-1){ if(mat[i-1][j-1] == 'X' && mat[i+1][j-1] == 'X' && mat[i-1][j+1] == 'X' && mat[i+1][j+1] == 'X') out++; } } cout << out;
Rick York
Я понятия не имею, и это тоже не имеет большого смысла. Символьная матрица никогда не инициализируется, и все индексы, обращающиеся к ней, начинаются с 2 и часто имеют член -1, поэтому нулевая позиция, по-видимому, никогда не будет доступна. Это очень плохой способ сделать что-то, потому что он затрудняет просмотр данных в отладчике. Вы можете изменить алгоритм, вычитая 1 из каждого вычисления индекса и цикла.
Почему вы используете макрос для оператора "for"? Это не очень умный поступок. Я не могу придумать ни одной причины, чтобы сделать это, но я могу придумать много причин, чтобы не делать этого.