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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2011, 12:03   #1
IBM
Новичок
Джуниор
 
Регистрация: 12.05.2011
Сообщений: 3
По умолчанию Задача "Офицеры"

Подсчитать количество способов расставить j слонов на доске nxn.

Я на сайте http://e-maxx.ru/algo/bishops_arrangement нашел довольно неплохое объяснение её но при попытки реализации выводит ошибку в строчке vector < vector<int> > d (n*2, vector<int> (k+2)); Подскажите пожалуйста как исправить эту ошибку и что автор делает с её помощью.
Вот мой код :

Код:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int cells (int i) 
{
	if (i & 1)
		return i / 4 * 2 + 1;
	else
		return (i - 1) / 4 * 2 + 2;
}
int main()
{

  int n, k; 
  scanf("%d%d",n,k);
if (k > 2*n-1) {
	printf("0");
	return 0;
}

vector < vector<int> > d (n*2, vector<int> (k+2));
for (int i=0; i<n*2; ++i)
	d[i][0] = 1;
d[1][1] = 1;
for (int i=2; i<n*2; ++i)
	for (int j=1; j<=k; ++j)
		d[i][j] = d[i-2][j] + d[i-2][j-1] * (cells(i) - j + 1);

int ans = 0;
for (int i=0; i<=k; ++i)
	ans += d[n*2-1][i] * d[n*2-2][k-i];
printf("%d",ans);

    return 0;
}

Последний раз редактировалось AlDelta; 12.05.2011 в 12:20.
IBM вне форума Ответить с цитированием
Старый 12.05.2011, 14:36   #2
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Ну это видимо должно быть объявление массива
попробуй так
Код:
int d[n*2][k+2];
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Старый 12.05.2011, 14:58   #3
IBM
Новичок
Джуниор
 
Регистрация: 12.05.2011
Сообщений: 3
По умолчанию

исправил ошибку вроде все нормально но почему то получаю отрицательные числа

Код:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int cells (int i)
 {
	if (i & 1)
		return i / 4 * 2 + 1;
	else
		return (i - 1) / 4 * 2 + 2;
}
int main()
{

  int n, k;
  scanf("%d%d",n,k);
if (k > 2*n-1)
 {
	printf("0");
	return 0;
}

int d[n*2][k+2];
for (int i=0; i<n*2; ++i)
	d[i][0] = 1;
d[1][1] = 1;
for (int i=2; i<n*2; ++i)
	for (int j=1; j<=k; ++j)
		d[i][j] = d[i-2][j] + d[i-2][j-1] * (cells(i) - j + 1);

int ans = 0;
for (int i=0; i<=k; ++i)
	ans += d[n*2-1][i] * d[n*2-2][k-i];
printf("%d",ans);

    return 0;
}

Последний раз редактировалось IBM; 13.05.2011 в 01:32.
IBM вне форума Ответить с цитированием
Старый 13.05.2011, 11:20   #4
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

попробуй явно указывать приведение типов, плюс я еще условие подправил, но по идее это тож самое.
Код:
int cells (int i)
{
	if (i%2==1)
		return int(i / 4) * 2 + 1;
	else
		return int((i - 1) / 4) * 2 + 2;
}
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Старый 13.05.2011, 15:26   #5
IBM
Новичок
Джуниор
 
Регистрация: 12.05.2011
Сообщений: 3
По умолчанию

не там все верно вы мне подсказали просто там нада будет массив инициализировать как 0
int d[n*2][ k + 2]= {0}; и тогда все нормально работает
IBM вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
"Транспортная задача", "Поиск решения" Perroman Microsoft Office Excel 3 12.12.2007 17:12