Подсчет суммы рядов матрицы
-
- Уже с Приветом
- Posts: 356
- Joined: 25 Jul 2001 09:01
- Location: USA
Подсчет суммы рядов матрицы
Дана матрица 3x3 и числа от 1 до 9. Написать алгоритм, размещающий эти чмсла в матрице так чтобы все вертикалбные, горизонтальные и диагональные ряды имели одинаковую сумму чисел в их ячейках.
-
- Уже с Приветом
- Posts: 3179
- Joined: 12 Jun 2001 09:01
- Location: SPb,Russia->Rehovot, Israel->Cambridge, MA
Работает для всех нечётных SIZE...
[code:1:0fb17d8c30]
#include <stdio.h>
#include <string.h>
#define SIZE 3
int
main(int argc, char *argv[])
{
int matrix[SIZE][SIZE];
int n, ii, jj, i = 0, j = SIZE >> 1;
memset(matrix, 0, sizeof(matrix));
for (n = 1; n <= SIZE * SIZE; ++n)
{
matrix[i][j] = n;
ii = (i > 0) ? i - 1 : SIZE - 1;
jj = (j + 1) % SIZE;
if (matrix[ii][jj])
{
ii = (i + 1) % SIZE;
jj = j;
}
i = ii;
j = jj;
}
for (i = 0; i < SIZE; ++i)
{
for (j = 0; j < SIZE; ++j)
{
printf("%3d", matrix[i][j]);
}
printf("\n");
}
return 0;
}
[/code:1:0fb17d8c30]
[code:1:0fb17d8c30]
#include <stdio.h>
#include <string.h>
#define SIZE 3
int
main(int argc, char *argv[])
{
int matrix[SIZE][SIZE];
int n, ii, jj, i = 0, j = SIZE >> 1;
memset(matrix, 0, sizeof(matrix));
for (n = 1; n <= SIZE * SIZE; ++n)
{
matrix[i][j] = n;
ii = (i > 0) ? i - 1 : SIZE - 1;
jj = (j + 1) % SIZE;
if (matrix[ii][jj])
{
ii = (i + 1) % SIZE;
jj = j;
}
i = ii;
j = jj;
}
for (i = 0; i < SIZE; ++i)
{
for (j = 0; j < SIZE; ++j)
{
printf("%3d", matrix[i][j]);
}
printf("\n");
}
return 0;
}
[/code:1:0fb17d8c30]
Last edited by Azazello on 24 May 2002 02:02, edited 1 time in total.
Всё чудесатее и чудесатее... (c) Alice
-
- Уже с Приветом
- Posts: 356
- Joined: 25 Jul 2001 09:01
- Location: USA
-
- Уже с Приветом
- Posts: 778
- Joined: 30 Mar 2001 10:01
- Location: Lithuania -> MA
-
- Уже с Приветом
- Posts: 3179
- Joined: 12 Jun 2001 09:01
- Location: SPb,Russia->Rehovot, Israel->Cambridge, MA
Во-первых, я поправил баг - работало для 3, но не работало для остальных нечётных.
По поводу книжек - я уже не помню, где именно я увидел в первый раз задачу о магическом квадрате и её решение в общем виде для нечётных размерностей. По-моему, у Перельмана в "Живой математике", но может быть и у Кордемского в "Математической смекалке", а может и у Мартина Гарднера в одной из его книг.
Понятно, там приводилась не программа, а "рецепт", т.е. алгоритм. Исполнение на C - моё (c).
Ни в одной из перечисленных книг я не видел формального доказательства. Возможно, оно есть у Куранта и Роббинса ("Что такое математика"), но я не уверен. Просто это единственная книга из моего детства, где были хоть какие-то доказательства...
Естественно, за давностью лет я этого доказательства не помню, а думать сейчас лень - но могу попробовать на досуге - я когда-то неплохо умел доказывать простые теоремы....
По поводу книжек - я уже не помню, где именно я увидел в первый раз задачу о магическом квадрате и её решение в общем виде для нечётных размерностей. По-моему, у Перельмана в "Живой математике", но может быть и у Кордемского в "Математической смекалке", а может и у Мартина Гарднера в одной из его книг.
Понятно, там приводилась не программа, а "рецепт", т.е. алгоритм. Исполнение на C - моё (c).
Ни в одной из перечисленных книг я не видел формального доказательства. Возможно, оно есть у Куранта и Роббинса ("Что такое математика"), но я не уверен. Просто это единственная книга из моего детства, где были хоть какие-то доказательства...
Естественно, за давностью лет я этого доказательства не помню, а думать сейчас лень - но могу попробовать на досуге - я когда-то неплохо умел доказывать простые теоремы....
Всё чудесатее и чудесатее... (c) Alice
-
- Уже с Приветом
- Posts: 356
- Joined: 25 Jul 2001 09:01
- Location: USA
-
- Уже с Приветом
- Posts: 3179
- Joined: 12 Jun 2001 09:01
- Location: SPb,Russia->Rehovot, Israel->Cambridge, MA
[quote:4a7ae9a4e3="Token"]Так вы что еще давно этот алгоритм написали? Если нет то хотелось бы все-таки увидеть словестное описание алгоритма или идеи хотя-бы. Сам алгоритм совершенно не прозрачен.[/quote:4a7ae9a4e3]
Словесное описание такое:
1. Представим себе, что квадрат окружён такими же (всего их будет - по одному примыкает к каждой стороне и ещё по одному - с углов. Назовём их дополнительными.
2. Ставим единицу в среднюю клетку верхнего ряда.
3. Следующее число ставим в клетку, находящуюся на единицу выше и правее предыдущей, если она пуста. Иначе - в клетку, находящуюся на единицу ниже предыдущей. Если мы вышли за пределы основного квадрата, скопируем число в основной квадрат из дополнительного, сохраняя координаты (выполним параллельный перенос) и продолжим с этого места.
Словесное описание такое:
1. Представим себе, что квадрат окружён такими же (всего их будет - по одному примыкает к каждой стороне и ещё по одному - с углов. Назовём их дополнительными.
2. Ставим единицу в среднюю клетку верхнего ряда.
3. Следующее число ставим в клетку, находящуюся на единицу выше и правее предыдущей, если она пуста. Иначе - в клетку, находящуюся на единицу ниже предыдущей. Если мы вышли за пределы основного квадрата, скопируем число в основной квадрат из дополнительного, сохраняя координаты (выполним параллельный перенос) и продолжим с этого места.
Всё чудесатее и чудесатее... (c) Alice
-
- Уже с Приветом
- Posts: 356
- Joined: 25 Jul 2001 09:01
- Location: USA
-
- Уже с Приветом
- Posts: 3179
- Joined: 12 Jun 2001 09:01
- Location: SPb,Russia->Rehovot, Israel->Cambridge, MA
-
- Уже с Приветом
- Posts: 356
- Joined: 25 Jul 2001 09:01
- Location: USA
-
- Новичок
- Posts: 30
- Joined: 18 Jul 2002 16:21
- Location: Москва
Re: Подсчет суммы рядов матрицы
[quote:ed8d29a8a9="Token"]Дана матрица 3x3 и числа от 1 до 9. Написать алгоритм, размещающий эти чмсла в матрице так чтобы все вертикалбные, горизонтальные и диагональные ряды имели одинаковую сумму чисел в их ячейках.[/quote:ed8d29a8a9]
Решение (из него же алгоритм) даже без компа.
Сумма от 1 до 9 равна 45, след в каждой вертикали диагонали по 15.
Через центр проходит 4 линии.
Если в центре 1 то чтобы сумма была 15 нужны 4 пары по 14 а их всего 2 (9,5) и (8,6)
Не получается. Для 2 и 3 в центре тоже не 4 пары не построить.
Если в центре 4 то в остальных парах нет 1 (зато есть вторая 4)))
Остается в центре 5 а остальные пары дают в сумме по 10 (9,1) (8,2) (7,3) и (6,4).
Каждой матрице а(i,k) соответствует матрица 10-а(i,k), поэтому дальше 5 перебирать не стоит.
Таким образом в центре ТОЛЬКО 5!
Пусть одна диагональ 9,1, тогда никакая другая пара для диагонали не удовлетворит (сумма вертикали или горизонтали больше 15!)
Если диагональ 8,2 то вторая по той же причине не может быть 7,3 и остается только 6,4.
Все остальные 4 элемента легко вычисляются.
Сколько таких квадратов?
Для первой диагонали (8,2) 4 положения. 8 в 4х углах.
для второй диагонали остается 2 положения (6 в двух оставшихся углах)
Всего 8 вариантов магического квадрата.
Решение (из него же алгоритм) даже без компа.
Сумма от 1 до 9 равна 45, след в каждой вертикали диагонали по 15.
Через центр проходит 4 линии.
Если в центре 1 то чтобы сумма была 15 нужны 4 пары по 14 а их всего 2 (9,5) и (8,6)
Не получается. Для 2 и 3 в центре тоже не 4 пары не построить.
Если в центре 4 то в остальных парах нет 1 (зато есть вторая 4)))
Остается в центре 5 а остальные пары дают в сумме по 10 (9,1) (8,2) (7,3) и (6,4).
Каждой матрице а(i,k) соответствует матрица 10-а(i,k), поэтому дальше 5 перебирать не стоит.
Таким образом в центре ТОЛЬКО 5!
Пусть одна диагональ 9,1, тогда никакая другая пара для диагонали не удовлетворит (сумма вертикали или горизонтали больше 15!)
Если диагональ 8,2 то вторая по той же причине не может быть 7,3 и остается только 6,4.
Все остальные 4 элемента легко вычисляются.
Сколько таких квадратов?
Для первой диагонали (8,2) 4 положения. 8 в 4х углах.
для второй диагонали остается 2 положения (6 в двух оставшихся углах)
Всего 8 вариантов магического квадрата.
Всем привет))