Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/75: Рейтинг темы: голосов - 75, средняя оценка - 4.81
 Аватар для Algolux
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 11

Построить магический квадрат размера n

24.05.2014, 00:55. Показов 14361. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Не могу решить задачку:
Построить магический квадрат порядка n, составленный из чисел 1, 2, …, n2, размером n×n.
Пишу так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import java.util.*;
import static java.lang.Math.*;
 
public class DZ_2
{
    public static void main(String args[])
    {
        Scanner in = new Scanner (System.in);
        System.out.print("Vvedite: N = ");
        int n = in.nextInt();
        int[][] a = new int[n][n];
        if (n % 4 > 0)
        {
            System.out.print("Error: N ne kratno 4 - em. Vvedite drugoe chislo.");
        }
        else
        {
            System.out.println("Ishodniy massiv: ");
            DZ_2.GenerateArray(a);
            DZ_2.PrintArray(a);
            System.out.println("Magicheskiy kvadrat: ");
            DZ_2.ReverseArray1(a);
            DZ_2.ReverseArray2(a);
            DZ_2.PrintArray(a);
        }
    }
 
    public static void PrintArray(int a[][])
    {
        for (int i = 0; i < a.length; i++)
        {
            for (int j = 0; j < a.length; j++)
            {
                System.out.print(a[i][j] + "\t");
            }
            System.out.println();
        }
    }
    
    public static void GenerateArray(int a[][])
    {
        int k = 1;
        for (int i = 0; i < a.length; i++)
        {
            for (int j = 0; j < a.length; j++)
            {
                a[i][j] = k;
                k++;
            }
        }
    }
    
    public static void ReverseArray1(int a[][])
    {
        int t;
        for (int i = 0; i < a.length / 2; i++)
        {
            for (int j = 0; j < a.length / 2; j++)
            {
                if (i == j)
                {
                    t = a[i][j];
                    a[i][j] = a[a.length - 1 - i][a.length - 1 - j];
                    a[a.length - 1 - i][a.length - 1 - j] = t;
                }
            }
        }
    }
    
    public static void ReverseArray2(int a[][])
    {
        int t;
        for (int i = 0; i < a.length / 2 - 1; i++)
        {
            for (int j = a.length - 1; j > 2; j--)
            {
                t = a[i][j];
                a[i][j] = a[a.length - 1 - i][a.length - 1 - j];
                a[a.length - 1 - i][a.length - 1 - j] = t;
            }
        }
    }   
}
Не получается переставить местами элементы побочной диагонали (ReverseArray2 работает не правильно).
Помогите пожалуйста.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.05.2014, 00:55
Ответы с готовыми решениями:

Магический квадрат
Добрый День!!! Помогите Пожалуйста написать программу: Определить является ли целочисленная матрица порядка n магическим квадратом, т.е...

Магический квадрат
Я написал код определения магического квадрата. Подскажите, правилен ли он? С квадратной матрицей работать, вроде проще, чем с...

Магический квадрат с двумя классами
Код программы собственно есть. Но в задании внезапно указано, что в программе должно быть как минимум два класса. Потому обращаюсь к...

10
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
25.05.2014, 15:29
Algolux, Числа в массиве должны просто записаться в обратном порядке и все??????
0
 Аватар для Algolux
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 11
25.05.2014, 15:39  [ТС]
Да, элементы главной и побочной диагонали должны записываться в обратном порядке.
Я посмотрел, у меня с побочной всё нормально, а вот с главной нет.
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
25.05.2014, 15:57
Algolux, а зачем ReverseArray1 и ReverseArray2? Что в них делаете?

Добавлено через 1 минуту
Я не понимаю просто, что за магический квадрат.
Метода должна просто переписать числа в обратном порядке, так? Забудьте про главную и побочную диагональ.
0
 Аватар для Algolux
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 11
25.05.2014, 16:08  [ТС]
Смотрите, магический квадрат - сумма элементов строк, столбцов, диагоналей, должна быть одинакова.
Я в интернете нашел способ, что-бы получить магический квадрат, в матрице кратной 4-ем, нужно поменять местами элементы главной и побочной диагоналей, т. е. записать их в обратном порядке.
ReverseArray1 - метод меняющий местами элементы главной диагонали.
ReverseArray2 - побочной.
ReverseArray2 - работает не правильно. Нужно его переделать.
На рисунке видно, что с главной диагональю, всё как надо, а вот побочной...
Миниатюры
Построить магический квадрат размера n  
0
 Аватар для Algolux
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 11
26.05.2014, 14:09  [ТС]
Пробую сделать так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void ReverseArray2(int a[][])
{
    int t;
    for (int i = 0; i < a.length / 2; i++)
    {
        for (int j = 0; j < a.length / 2; j++)
        {
            if (j == a.length - i - 1)
            {
                            t = a[i][j];
                            a[i][j] = a[a.length - 1 - i][a.length - 1 - j];
                            a[a.length - 1 - i][a.length - 1 - j] = t;
            }
        }
    }
}
Но ничего не происходит.

Добавлено через 21 час 37 минут
Тема по прежнему актуальна.
0
51 / 51 / 42
Регистрация: 06.09.2013
Сообщений: 188
26.05.2014, 16:31
Лучший ответ Сообщение было отмечено Algolux как решение

Решение

Algolux, просто поменять местами элементы главной и побочной диагонали не выход, вот, убедитесь!

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
import java.util.Arrays;
 
class CreateMagic {
    
    private int[][] mas;
    
    public CreateMagic(int[][] _mas) {
        
        mas = _mas;
        show_mas();
        create();
    }
    
    public void create() {
        
        for(int i = 0, j = mas.length - 1; i <= (mas.length / 2) - 1; ++i, --j) {
            
            int temp = mas[i][i];
            mas[i][i] = mas[j][j];
            mas[j][j] = temp;
 
        }
        
        for(int i = 0, j = mas.length - 1 - i; i <= (mas.length / 2) - 1; ++i, --j) {
            
            int temp = mas[i][j];
            mas[i][j] = mas[j][i];
            mas[j][i] = temp;
 
        }
    }
    
    public void show_mas() {
        
        for(int[] _mas : mas) {
            for(int value : _mas) {
            
                System.out.printf("%-3d", value);
            }
            System.out.println();
        }
        System.out.println();
    }
}
 
class IsMagic {
    
    private int f_sum;
    private int[][] mas;
    
    public IsMagic(int[][] mas) {
        
        this.mas = mas;
         f_sum = sum(Arrays.copyOf(mas[0], mas[0].length));
    }
    
     //метод определяющий является ли заданная матрица магическим квадратом
    public boolean magic_square() {
        
        if(comparing_strings())
            return false;
        
        if(comparison_of_columns())
            return false;
 
        if(diagonal_matrices())
            return false;
        
        return true;
    }
    
    //метод сравнивающий суммы элементов каждой строки матрицы
    public boolean comparing_strings() {
 
        for(int[] temp : mas) {
            
            int value = sum(temp);
            
            if(f_sum != value) {
                return true;
            }
        }
        
        return false;
    }
    
    //метод сравнивающий суммы элементов каждого столбца матрицы
    public boolean comparison_of_columns() {
        
        for(int i = 0; i < mas.length; ++i) {
            
            int[] temp = new int[mas[i].length];
            for(int j = 0; j < mas[i].length; ++j) {
                
                temp[j] = (int) mas[j][i];
            }   
            
            int value = sum(temp);
            
            if(f_sum != value) {
                return true;
            }
            
            temp = null;
        }
        
        return false;
    }
    
    //метод сравнивающий суммы элементов главной и побочной диагоналей матрицы
    public boolean diagonal_matrices() {
        
        int[] temp = new int[mas.length];
        for(int i = 0; i < mas.length; ++i)
            temp[i] = (int) mas[i][i]; 
        
        int value = sum(temp);
        
        if(f_sum != value) {
            return true;
        }
        
        temp = new int[mas.length];
            
        for(int i = 0, j = mas.length - 1; i < mas.length; ++i, --j) 
            temp[i] = (int) mas[i][j]; 
        
        value = sum(temp);
        
        if(f_sum != value) {
            return true;
        }
        
        return false;
    }
    
    //метод суммирования элементов переданного массива 
    public int sum(int... numbers){
          
        if(numbers == null) {
              return 0;
        }
        
        int result = 0;
        for(int number: numbers){
            
             result += number;
        }
        
        return result;   
    }
}
 
public class Test {
 
    public static int[][] init_mas(int n) {
        
        int[][] mas = new int[n][n];
        
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < n; ++j)
                mas[i][j] =  (int)(Math.random() * 10);
        
        return mas;
    }
    
    public static void main(String[] args) {
        
        int[][] mas = init_mas(4);
        CreateMagic magic = new CreateMagic(mas);
        
        magic.show_mas();
        
        IsMagic isMagic = new IsMagic(mas);
        boolean flag = isMagic.magic_square();
        
        if(flag)
            System.out.println("Магический квадрат!");
        else
            System.out.println("Не магический квадрат!");
    }
 
}
1
 Аватар для Algolux
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 11
26.05.2014, 20:33  [ТС]
Большое спасибо, вы мне очень помогли.
Сделал так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import java.util.*;
import static java.lang.Math.*;
 
public class DZ_2
{
    public static void main(String args[])
    {
        Scanner in = new Scanner (System.in);
        System.out.print("Vvedite: N = ");
        int n = in.nextInt();
        int[][] a = new int[n][n];
        if (n % 4 > 0)
        {
            System.out.print("Error: N ne kratno 4 - em. Vvedite drugoe chislo.");
        }
        else
        {
            System.out.println("Ishodniy massiv: ");
            DZ_2.GenerateArray(a);
            DZ_2.PrintArray(a);
            System.out.println("Magicheskiy kvadrat: ");
            DZ_2.ReverseArray1(a);
            DZ_2.ReverseArray2(a);
            DZ_2.PrintArray(a);
        }
    }
 
    public static void PrintArray(int a[][])
    {
        for (int i = 0; i < a.length; i++)
        {
            for (int j = 0; j < a.length; j++)
            {
                System.out.print(a[i][j] + "\t");
            }
            System.out.println();
        }
    }
    
    public static void GenerateArray(int a[][])
    {
        int k = 1;
        for (int i = 0; i < a.length; i++)
        {
            for (int j = 0; j < a.length; j++)
            {
                a[i][j] = k;
                k++;
            }
        }
    }
    
    public static void ReverseArray1(int a[][])
    {
        int t;
        for (int i = 0; i < a.length / 2; i++)
        {
            for (int j = 0; j < a.length / 2; j++)
            {
                if (i == j)
                {
                                t = a[i][j];
                                a[i][j] = a[a.length - 1 - i][a.length - 1 - j];
                                a[a.length - 1 - i][a.length - 1 - j] = t;
                }
            }
        }
    }
    
    public static void ReverseArray2(int a[][])
    {
        int t;
        for (int i = 0, j = a.length - 1 - i; i <= (a.length / 2) - 1; ++i, --j) 
        {
                    t = a[i][j];
                    a[i][j] = a[j][i];
                    a[j][i] = t;
        }
    }   
}
Ещё раз спасибо.
Миниатюры
Построить магический квадрат размера n  
0
51 / 51 / 42
Регистрация: 06.09.2013
Сообщений: 188
27.05.2014, 16:21
Algolux, а если взять произвольную матрицу с размерностью кратной 4, то ваш метод не работает
0
 Аватар для Algolux
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 11
27.05.2014, 19:03  [ТС]
Цитата Сообщение от Yoghurt_92 Посмотреть сообщение
Algolux, а если взять произвольную матрицу с размерностью кратной 4, то ваш метод не работает
Да, я знаю, но по заданию у меня:
Цитата Сообщение от Algolux Посмотреть сообщение
Построить магический квадрат порядка n, составленный из чисел 1, 2, …, n2, размером n×n.
Так, что всё нормально, зачли.
0
51 / 51 / 42
Регистрация: 06.09.2013
Сообщений: 188
27.05.2014, 20:17
Algolux,
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.05.2014, 20:17
Помогаю со студенческими работами здесь

Построить магический квадрат

Построить магический квадрат
Магический квадрат порядка n называется квадратная матрица размером n*n, составленная из чисел 1, 2, ..., n2 так, что суммы по каждому...

Построить магический квадрат
Написать программу, которая позволяет построить магический квадрат любой четности при 10&lt;=n&lt;=5

Построить магический квадрат 5 порядка
4. Используя любой удобный метод, построить магический квадрат 5 порядка. Помогите ПЛИЗ!!!Очень нужно решить. А то я Дуб дубов этом((

Построить магический квадрат порядка n
построить магический квадрат порядка n в pascal. чтоб по горизонтали по вертикали и по диагонали была равна сумма цифр


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru