Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2015, 18:12   #1
FIDE
Заблокирован
 
Регистрация: 02.08.2014
Сообщений: 30
По умолчанию Несложная задача на поиск в глубину

Всем привет. Есть несложная(наверняка очень легкая для других) задача на поиск в глубину. http://codeforces.com/problemset/problem/598/D
У меня вот в чем проблема. С одной стороны нужно отмечать пройденные клетки в матрице bool с другой стороны при решение задачи для следующих x,y надо считать что мы никуда не заходили, т.е везде где b[i][j]=true везде должно быть false. Я придумал такой костыль: завел массив пар del и в него кидал все клетки в которые мы заходили, а потом после того как решим задачу для одной пары x,y очищал этот массив. Но такое решение не проходит по времени да и наверняка тут не нужна эта дополнительная память. Подскажите пожалуйста как мне реализовать эту задачу. Спасибо
Код:
#include <bits/stdc++.h>
 
using namespace std;

vector <string> a;
vector < vector <bool> > b;
vector < pair<int,int> > del;
int n,m,k,c;

void dfs(const int& x,const int& y)
{
	del.push_back({x,y});
	if (x<0 || y<0 || x>n-1 || y>m-1) return;
	if (b[x][y]) return;
	
	if (a[x][y]=='*')
	{
		c++;
		return;
	}
	b[x][y]=true;
	dfs(x,y-1);
	dfs(x,y+1);
	dfs(x+1,y);
	dfs(x-1,y);
	//b[x][y]=false;
}

int main()
{
	//ifstream cin("in.txt");
	//ofstream cout("out.txt");
	
	cin>>n>>m>>k;
	a.resize(n);
	for (int i=0;i<n;i++) cin>>a[i];

	b.assign(n,vector<bool>(m,false));
	for (int i=0;i<k;i++)
	{
		int x,y; cin>>x>>y;
		del.clear();
		c=0; dfs(x-1,y-1); 
		cout<<c<<"\n";
		for (int j=0;j<del.size();j++) b.at(del[j].first).at(del[j].second)=false; 	
	}
	
}
FIDE вне форума Ответить с цитированием
Старый 02.12.2015, 21:52   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

А зачем очищать? Ведь если в этой области уже был поиск, то может быть использовать повторно его результаты? А если поиска в области не было, то зачем очищать?
FPaul вне форума Ответить с цитированием
Старый 02.12.2015, 22:15   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Золотые слова..
И совсем не кошерно тут использовать dfs. Крути bfs c очередью. Сохраняй ответы, чтобы не пересчитывать. Тогда сложность будет - кол-во ячеек (для просчета всего)
Можно даже так и сделать. Пройтись по всем ячейкам (квадрат) и смотреть извествен ли для нее результатам. Если нет - запустить bfs - сохранить этот ответ во всех ячейках области (памяти и времени хватит (вроде. не читал ограничения, а открывать лень)).

А потом за О(1) ответчать
Poma][a вне форума Ответить с цитированием
Старый 03.12.2015, 20:05   #4
FIDE
Заблокирован
 
Регистрация: 02.08.2014
Сообщений: 30
По умолчанию

Цитата:
Золотые слова..
Да, действительно. Странно, что мне не пришла в голову такая идея. Всем спасибо.
З.Ы Почему я не могу Ромахе добавить отзыв никак?
FIDE вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несложная задача на поиск в ширину FIDE Помощь студентам 7 27.11.2015 15:59
DFS( поиск в глубину) MagAragorn Паскаль, Turbo Pascal, PascalABC.NET 1 27.04.2013 05:19
граф поиск в глубину revoltecklol Паскаль, Turbo Pascal, PascalABC.NET 0 14.05.2012 23:47
итеративный поиск в глубину Anastasia.K Помощь студентам 1 23.10.2011 09:21
Поиск в глубину Nicko_mt Помощь студентам 2 20.09.2011 14:15