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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2012, 15:57   #1
LiverX
 
Регистрация: 17.10.2012
Сообщений: 3
По умолчанию Что-то не так?

Есть программа, которая должна вычислять за сколько подходов вирус заразит всё поле. (Да я дибил я написал программу в лоб, но большего пока мне и не надо)
Переменные:
n - размер поля n*n.
m - кол-во подсаженых вирусов
x,y - координаты для чтения из файла (и только).
maxx, maxy - для ограничения цикла, работает не совсем правильно...
bigx, bigy - используется 1 раз для определиния наибольшей координаты.
time - собственно время заражения и
i, j - цикловые переменные.
Код:
#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;
//-----------The Variables-------------//
	unsigned int n, m, x, y, maxcount = 0, maxy,
		maxx, bigx = 0, bigy = 0, time = 0, i, j;
	bool done;
	int field[1000][1000];
//-----------The Program-----------//
void grow ()
{
	for(i = 0; i <= maxy; i++)
	{
		for(j = 0; j <= maxx; j++)
		{
			if(field[i][j] == 3)
			{
				if(field[i+1][j] == 1)
				{
					field[i+1][j] = 2;
					if(maxx < n-1) maxx++;
				}
				if(field[i-1][j] == 1)
				{
					field[i-1][j] = 2;
				}
				if(field[i][j+1] == 1)
				{
					field[i][j+1] = 2;
					if(maxy < n-1) maxy++;
				}
				if(field[i][j-1] == 1)
				{
					field[i][j-1] = 2; 
				}
			}
		}
	}
	for(i = 0; i <= maxy; i++)
		for(j = 0; j <= maxx; j++)
			if(field[i][j] == 2) field[i][j] = 3;
	return;
}

int main ()
{
	ifstream inf ("in.txt");
	ofstream of ("out.txt");
	inf >> n >> m;
	for(i = 0; i < n; i++)
		for(j = 0; j < n; j++)
			field[i][j] = 1;
	for(i = 0; i < m; i++)
	{
		inf >> x >> y;
		field[x-1][y-1] = 3;
		if(x > bigx) bigx = x;
		if(y > bigy) bigy = y;
	}
	maxx = bigx;
	maxy = bigy;
	do
	{
		done = true;
		grow();
		i = 0;
		do
		{
			j = 0;
			do
			{
				if(field[i][j] == 1) done = false;
				j++;
			}
			while(!((done == false) || ((i == n) && (j == n)) || (j == n)));
			i++;
		}
		while(!((done == false) || ((i == n) && (j == n))));
		time++;
	}
	while(!((done == true) || ((maxx == m) && (maxy == m))));
	/*
	char* field;
	field = new char[n][n];
	delete[] field;
	*/
	of << time;
	inf.close();
	of.close();
	return 0;
}
Я могу вычислить 990 на 990 размером поле, но вот ставлю 1000... висит. Почему?
LiverX вне форума Ответить с цитированием
Старый 04.12.2012, 16:04   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Код:
for(i = 0; i <= maxy; i++)
//...
  field[i][j]
Нехорошо. Будет обращение field[maxy][j], а оно Вам надо?
Abstraction вне форума Ответить с цитированием
Старый 04.12.2012, 16:27   #3
LiverX
 
Регистрация: 17.10.2012
Сообщений: 3
По умолчанию

А ведь j тоже до maxx досчитывает. Нет, дело в другом
LiverX вне форума Ответить с цитированием
Старый 04.12.2012, 16:31   #4
LiverX
 
Регистрация: 17.10.2012
Сообщений: 3
По умолчанию

Сработало! А ведь на паскале у меня была та же итория. Ответ правильный.
Код:
#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;
//-----------The Variables-------------//
	unsigned int n, m, x, y, maxcount = 0, maxy,
		maxx, bigx = 0, bigy = 0, time = 0, i, j;
	bool done;
	int field[1001][1001];
//-----------The Program-----------//
void grow ()
{
	for(i = 0; i <= maxy; i++)
	{
		for(j = 0; j <= maxx; j++)
		{
			if(field[i][j] == 3)
			{
				if(field[i+1][j] == 1)
				{
					field[i+1][j] = 2;
					if(maxx < n-1) maxx++;
				}
				if(field[i-1][j] == 1)
				{
					field[i-1][j] = 2;
				}
				if(field[i][j+1] == 1)
				{
					field[i][j+1] = 2;
					if(maxy < n-1) maxy++;
				}
				if(field[i][j-1] == 1)
				{
					field[i][j-1] = 2; 
				}
			}
		}
	}
	for(i = 0; i <= maxy; i++)
		for(j = 0; j <= maxx; j++)
			if(field[i][j] == 2) field[i][j] = 3;
	return;
}

int main ()
{
	ifstream inf ("in.txt");
	ofstream of ("out.txt");
	inf >> n >> m;
	for(i = 0; i < n; i++)
		for(j = 0; j < n; j++)
			field[i][j] = 1;
	for(i = 0; i < m; i++)
	{
		inf >> x >> y;
		field[x-1][y-1] = 3;
		if(x > bigx) bigx = x;
		if(y > bigy) bigy = y;
	}
	maxx = bigx;
	maxy = bigy;
	do
	{
		done = true;
		grow();
		i = 0;
		do
		{
			j = 0;
			do
			{
				if(field[i][j] == 1) done = false;
				j++;
			}
			while(!((done == false) || ((i == n) && (j == n)) || (j == n)));
			i++;
		}
		while(!((done == false) || ((i == n) && (j == n))));
		time++;
	}
	while(!((done == true) || ((maxx == m) && (maxy == m))));
	/*
	char* field;
	field = new char[n][n];
	delete[] field;
	*/
	of << time;
	inf.close();
	of.close();
	return 0;
}
Увеличил размер массива на единицу.
LiverX вне форума Ответить с цитированием
Старый 04.12.2012, 16:32   #5
BigDaddy
Пользователь
 
Регистрация: 23.11.2012
Сообщений: 45
По умолчанию

Abstraction, откликнись, пожалуйста, в
icq: 600152898
skype: Valeri5514

спасибо!
очень важно..
лучше день потерять, а потом за пять минут долететь
BigDaddy вне форума Ответить с цитированием
Старый 04.12.2012, 16:46   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Abstraction, откликнись, пожалуйста, в
Мне проще откликнуться здесь.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что не так? ромик0 Работа с сетью в Delphi 0 19.11.2011 17:09
Что не так ...? С++ keksik Visual C++ 7 19.09.2011 08:21
Что-то не так в программе...не пойму что Karina_Vamp Помощь студентам 5 24.12.2010 21:06
Что не так? shozanah Помощь студентам 8 19.09.2010 20:45