Задано конечное множество имен жителей некоего города,
причем для каждого из жителей перечислены имена его детей.
Жители X и Y называются родственниками ,если
a) либо X - ребенок Y
b) либо Y - ребенок X
c) либо существует некий Z такой, что X - родственник Z, а Z - родственник Y.
Перечислить все пары жителей города,которые являются родственниками.
Задача, как по мне, выше среднего уровня.
Первая проблема которая перед нами стоит - это как задать начальные данные.
Я долго думал на эту тему и пришел к выводу, что пользователю проще работать
с именами, чем с индексами соотв. имени. Поэтому я не пошел стандартным путём
( а это задание вектора имен, потом задание вектора векоторов + вектор булевых переменных для раскраски... - муть зеленая)
Я использовал наборы из STL, т.е std::set
Для описания связи я использовал std::pair
Задав таким образом пары мы перезходим к следующей проблеме - нужно получить список уникальных имен, т.е. получить набор всех жителей. С этим отлично справился контейнер std::set.
Теперь нам нужно оценить каждого с каждым на предмет родства, это делать удобнее с std:vector - поэтому мы перегоняем данные из set в vector
Ну и самое главное - определение родства. Используем рекурсию для обхода дерева (направленный граф) для получения родственников для заданного человека, а потом ищем в нем того с чем определяем родство....
Полное решение будет стоит 250WMR. Обращайтесь.
среда, 2 июня 2010 г.
понедельник, 17 мая 2010 г.
как поменять элементы массива местами c
как поменять элементы массива местами (Си)
самый простой способ для понимания это представить себе переменную в виде стакана с водой
итого мы имеем 2 стака с жидкостями которые нужно поменять местами (содержимое стакана)
как бы вы сделали это в реальной жизни? так же и в программе! - посредством третьего стакана!
int a = 10;
int b = 20;
int temp; //наш третий стакан - посредник
temp = a; //перелили в третий стакан содержимое первого
a = b; //первый у нас освободился? заполняем его содержимым второго
b = temp; //второй освободился? заполняем его содержимым третьего (а там что?)
вот и поменялись...
самый простой способ для понимания это представить себе переменную в виде стакана с водой
итого мы имеем 2 стака с жидкостями которые нужно поменять местами (содержимое стакана)
как бы вы сделали это в реальной жизни? так же и в программе! - посредством третьего стакана!
int a = 10;
int b = 20;
int temp; //наш третий стакан - посредник
temp = a; //перелили в третий стакан содержимое первого
a = b; //первый у нас освободился? заполняем его содержимым второго
b = temp; //второй освободился? заполняем его содержимым третьего (а там что?)
вот и поменялись...
javascript нахождение суммы цифр числа
javascript нахождение суммы цифр числа
<script>
var n = prompt ("number?", "1234")
var s = 0
while (n > 0)
{
s += n % 10
n = Math.floor(n/10)
}
alert("summa: " + s)
</script>
вторник, 11 мая 2010 г.
понедельник, 10 мая 2010 г.
количество счастливых билетов
Кто возьмет билетов пачку, тот получит водокачку!
Нужно посчитать и вывести на экран количество "счастливых билетов"(к примеру: 111201, 333009 и так далее)
Примечание :
Счастливый билетик имеет вид XXXXXX.
var
a,b,c,d,e,f: integer;
g: double;
begin
g:=0;
for a:=0 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
for d:=0 to 9 do
for e:=0 to 9 do
for f:=0 to 9 do
if a+b+c=d+e+f then g:=g+1;
writeln(g);
end.
PS: обычно я решаю сам, а этот пример подсмотрел - уж очень мне понравилась простота решения, единственное что я добавил - это g - переменная типа double, т.к. результат получается больше чем может представлять пременная типа int, ну и в оригинале было inc - пришлось сдеать g=g+1, ибо inc только для целочисленной математики, еще бы полагалось выводить знаки только до запятой (число то все равно целое), но это уже сами кому надо...
вывести матрицу из файла с++
вывести матрицу из файла с++
часто встречаю подобные задачи, вот один из способов реализации
отмечу только, что раз мы считываем матрицу из файла - то мы заранее
не знаем ее размер, а раз так - то память под неё мы выделяем динамически
с помощью оператора new (не забываем освобождать после использования)
и нужно придумать в каком виде хранить матрицу
создадим текстовый файл matrix.txt
с таким содержанием
в нем первая строка содержит два числа,
первое - количество строк матрицы, второе кол-во столбцов
и вот вывод программы
часто встречаю подобные задачи, вот один из способов реализации
отмечу только, что раз мы считываем матрицу из файла - то мы заранее
не знаем ее размер, а раз так - то память под неё мы выделяем динамически
с помощью оператора new (не забываем освобождать после использования)
и нужно придумать в каком виде хранить матрицу
создадим текстовый файл matrix.txt
с таким содержанием
2 3 1 2 3 4 5 6
в нем первая строка содержит два числа,
первое - количество строк матрицы, второе кол-во столбцов
#include <stdio.h>
int main(int argc, char * argv[])
{
int n = 0;
int m = 0;
int **a;
//открываем файл
FILE * fp = fopen("matrix.txt", "r");
if (fp)
{
//читаем количество строк и столбцов
fscanf(fp, "%d %d", &n, &m);
//выделяем место
*a = new int(n);
for (int i = 0; i < n; i++) a[i] = new int(m);
//считываем данные из файла в матрицу
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
fscanf(fp, "%d", &a[i][j]);
}
}
//закрываем файл
fclose(fp);
}
//печать матрицы
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
//освобождение памяти
for (int i = 0; i < n; i++) delete a[i];
delete *a;
return 0;
}
и вот вывод программы
1 2 3 4 5 6
перевод чисел из двоичной системы в текст
/* перевод чисел из двоичной системы в текст */
#include <stdio.h>
void main()
{
int n = 1234;
int i = 0;
int m[32];
printf("10: %d\n", n);
while (n > 0)
{
m[i++] = n & 1;
n = n >> 1;
}
printf(" 2: ");
for (; i > 0; i--)
{
printf("%d", m[i-1]);
}
printf("\n");
}
Подписаться на:
Сообщения (Atom)