Tharindu Sathischandra Ответов: 2

Чтение строк в 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"? Это не очень умный поступок. Я не могу придумать ни одной причины, чтобы сделать это, но я могу придумать много причин, чтобы не делать этого.

2 Ответов

Рейтинг:
6

CPallini

Цитата:
Почему a[i] + 1 используется в scanf("%s", a[i] + 1);?. Почему там добавляется 1?
Потому что автор кода, буквально следуя описанию вопроса, намеренно проигнорировал первый столбец и первую строку кода.
C матрица (строка 0 и столбец 0, вы знаете).

По сути дела
a[i] + 1

это то же самое, что
&(a[i][1])

Это и есть адрес персонажа 1 из массива i.


Рейтинг:
15

Stefan_Lang

Единственный способ понять ваш questin-это не только посмотреть на код, но и на формулировку задачи: там определяется квадратная Матрица M со значениями индекса, идущими от 1 до n, а не от 0 до (n-1), как обычно в C/C++. Похоже, что решение пытается эмулировать это, просто пропуская первую строку (начиная с i=1) и первый столбец (добавляя +1 к a[i]).

Таким образом, странные смещения заключаются просто в том, чтобы настроить определение данных в соответствии со спецификацией проблемы. Это не то, как вы должны решать проблемы в реальном мире, но, по-видимому, в конкурсе это не имеет значения.