#c #arrays
#c #массивы
Вопрос:
У меня следующая проблема:
Парк, имеющий форму доски размером m x n. Существует k видов деревьев (1 <= k <= 100). Парк разделен на m x n ячеек, и в каждой ячейке они посадят дерево. Теперь на карте внутри каждой ячейки парка есть целое число i, если в ней посажено дерево i-го типа, или 0, если в ней нет дерева. Строка ячеек считается «хорошей», если в ней есть по крайней мере t деревьев одинаковых типов (и они должны находиться в одной строке или столбце). Подсчитайте количество деревьев, которых нет в «хорошей» строке.
Входные данные: Целые числа m, n, t и массив целых чисел m x n представляют карту.
Вывод: количество деревьев, которых нет в «хорошей» строке.
Пример:
Ввод: 5 6 3
1 3 3 3 3 4
1 2 3 2 0 4
3 2 2 2 4 4
1 0 0 2 4 0
1 2 3 0 4 4
Результат: 10
Объяснение: Жирными цифрами выделены деревья, которые не расположены в правильной строке.
1 3 3 3 3 4
1 2 3 2 0 4
3 2 2 2 4 4
1 0 0 2 4 0
1 2 3 0 4 4
Моя идея состоит в том, чтобы проверить наличие каждого элемента в массиве. Если оно удовлетворено, я перейду к ближайшему элементу за пределами «хорошей» строки. В противном случае он просто перейдет к следующему элементу в той же строке, или, если строка заканчивается, то к следующему элементу в столбце.
Вот мой код
#include <stdio.h>
#define maxn 120
int a[maxn][maxn], m, n, t;
int check(int *i, int *j){
int k, cnt_r, cnt_c;
cnt_r = 0;
//jump to the nearest cell that is not in good line
for(k = *i 1; k < m; k ){
if(a[*i][*j] == a[k][*j]) cnt_r ;
if(cnt_r >= t){
*i = k;
return 1;
}
}
cnt_c = 0;
for(k = *j 1; k < n; k ){
if(a[*i][*j] == a[*i][k]) cnt_c ;
if(cnt_c >= t){
*j = k;
return 1;
}
}
return 0;
}
//check if this is the last square or not
int lastSq(int r, int c){
return (r == n - 1 amp;amp; c == n);
}
int main(){
int res = 0, i, j, pos_r = 0, pos_c = 0;
scanf("%d%d%d", amp;m, amp;n, amp;t);
for(i = 0; i < m; i )
for(j = 0; j < n; j )
scanf("%d", amp;a[i][j]);
while(!lastSq(pos_r, pos_c)){
if(a[pos_r][pos_c] == 0){
if(pos_c < n - 1) pos_c ;
else if(pos_r < n - 1){
pos_c = 0;
pos_r ;
}
}
if(!check(amp;pos_r, amp;pos_c)){
res ;
if(pos_c < n - 1) pos_c ;
else{
pos_c = 0;
pos_r ;
}
}
}
printf("%d", res);
}
Но он не выводит никаких выходных данных. Единственное, что у меня есть, это 0xC0000005. Может кто-нибудь, пожалуйста, проверить, где я допустил ошибку, и указать мне направление? Спасибо.
Комментарии:
1. Слишком много звездочек! Вам не нужно постоянно обновлять указанные целые числа
2. Какое значение
t
?3. «Строка ячеек считается «хорошей», если в ней есть по крайней мере t деревьев одинаковых типов (и они должны находиться в одной строке или столбце)» Значение t предназначено для определения того, подходит строка или нет. В нашем примере t = 3.
4. Как вы узнаете,
scanf("%d%d%d", amp;m, amp;n, amp;t);
удастся ли? (иscanf("%d", amp;a[i][j]);
?)5. Слово «последовательный» не появляется в назначении, но появляется в вашем названии, это может означать, что вы искажаете или неправильно понимаете проблему. Пожалуйста, опубликуйте свое задание дословно.