Задача звучит так: карта мира содержится в файле и представляет собой матрицу размером m*n. Символ звездочка обозначает дерево. Несколько деревьев соответственно образуют лес(если деревья стоят по диагонали, то они также образуют лес). Надо найти самый большой лес.
Делала с помощью рекурсии. То есть функция CountForest у меня считает кол-во деревьев в одном лесу. Только вот проблема в том, что ответ всегда единица. При отладке показывает, что сначала идет вроде правильно, но потом когда возвращается назад, результат уменьшается опять до единицы. Помогите! Бьюсь над этой проблемой уже неделю.
(Новичок в си. До этого написала прогу на паскале. все работало)
Вот собственно код на си:
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "time.h"
#define n 6
#define m 6
int CountForest(char mp[m][n],int im,int jm,int r)
{ int i,j,b;
i=im; j=jm; b=0;
if (mp[i][j]=='*') {r++;mp[i][j]='0';};
if ((j<n)&&(i>1)&&(mp[i-1][j+1]=='*')){CountForest(mp,(i-1),(j+1),r);b=1;};
if ((j<n)&&(mp[i][j+1]=='*')){CountForest(mp,i,j+1,r);b=1;};
if ((j<n)&&(i<m)&&(mp[i+1][j+1]=='*')){CountForest(mp,(i+1),(j+1),r);b=1;};
if ((i<m)&&(mp[i+1][j]=='*')){CountForest(mp,(i+1),j,r);b=1;};
if ((i>1)&&(mp[i-1][j]=='*')){CountForest(mp,(i-1),j,r);b=1;};
if ((j>1)&&(i>1)&&(mp[i-1][j-1]=='*')){CountForest(mp,(i-1),(j-1),r);b=1;};
if ((j>1)&&(mp[i][j-1]=='*')){CountForest(mp,i,(j-1),r);b=1;};
if ((j>1)&&(i<m)&&(mp[i+1][j-1]=='*')){CountForest(mp,(i+1),(j-1),r);b=1;};
if (b==0) {return r;}
return r;
}
int main()
{ char map[m][n],ch;
int exist;
int count[m*n];
int i,j,a,b,c,res,max;
FILE *f;
//Открытие файла;
f=fopen("333.txt","r");
//Проверка доступа;
if (f==NULL)
{printf("Error opening the file.\n");exit(1);};
//Перезапись карты из файла в массив map;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
{ch = getc(f);
map[i][j]=ch;
}
}
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
{
putchar(map[i][j]);
}
}
//Обнуляем массив count, в котором хранятся длины всех лесов карты;
for(i=1;i<=m*n;i++) {count[i]=0;}
exist=1;
c=1;
while (exist==1)
{ a=1;b=1;
//проматываем все неподходящие символы слева направо и сверху вниз;
while((map[a][b]!='*')&&(a<=m))
{if (b<m) b++;
else {a++;b=1;};}
//как только нашли элемент , выполняем функция CountForest;
if ((a<=m)&& (map[a][b]=='*'))
{res=0;
count[c]=CountForest(map,a,b,res);
c++;
}
else exist=0;
}
//Ищем максимальный;
max=count[1];
for(i=2;i<=m*n;i++)
if (count[i]>max) max=count[i];
printf("The largest number of forest is %d",max);
//Закрытие файла;
fclose(f);
return 0;
}
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.