Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1

Сдвиг мартицы

10.08.2013, 17:58. Показов 5441. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что-то совсем мозги не варят, лето наверное влияет, но все же, есть задача, которую нужно выполнить:

* Выполнить циклический сдвиг заданной матрицы на k позиций
* вправо (влево, вверх, вниз).

Если со сдвигом вправо\влево разобрался, вот со сдвигом вверх\вниз нет.
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
package ru.junior_progger;
 
 
/**
 * Ввести с консоли n – размерность матрицы a[n][n]. 
 * Задать значения элемен-тов матрицы в интервале 
 * значений от -n до n с помощью датчика случайных чисел
 * 
 * Выполнить циклический сдвиг заданной матрицы на k позиций 
 * вправо (влево, вверх, вниз).
 */
 
public class Example_2 {
    public static void main(String[] args) {
        Example_2 e2 =  new Example_2();
        
        //int n = Util.getNumber();
        int [][] array = e2.getMatrix();
        System.out.println("Исходная матрица:");
        e2.print(array);
        System.out.println();
        int count = 10;
        
        System.out.println("Сдвиг вправо на " + count + " позиций");
        array = e2.shiftRight(array, 2);
        
        e2.print(array);
    }
    
    private int[][] getMatrix(){
        int[][] result = new int[5][5];
        
        int count = 0;
        for (int i = 0; i < result.length; i++) {
            for (int j = 0; j < result[i].length; j++) {
                result[i][j] = ++count;
            }
        }
        
        return result;
    }
    
    private int[][] getMatrix(int x) {
        int[][] result = new int[x][x];
        
        for (int i = 0; i < result.length; i++) {
            for (int j = 0; j < result[i].length; j++) {
                result[i][j] =(int) (-x  + Math.random() * 2 * x);
            }
        }
        return result;
    }
    
    private void print(int[][] array){
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }
    }
    
    public int[][] shiftUp(int[][] arr, int k){
        for (int i = 0; i < k; i++) {
            arr = shiftUp(arr);
        }
        return arr;
    }
    
    public int[][] shiftUp(int[][] arr) {
        // Хз че тут делать...
        return arr;
    }
 
    public int[][] shiftLeft(int[][] arr, int k) {
        if (k > 0)
            for (int i = 0; i < k; i++) {
                arr = shiftLeft(arr);
            }
 
        return arr;
    }
    
    public int[][] shiftLeft(int[][] arr) {
        int tmp = arr[0][0];
        for (int i = 0; i < arr.length; i++) {
            int j = 0;
            if(i + 1 < arr.length)
                j = arr[i + 1][0];
            System.arraycopy(arr[i], 1, arr[i], 0, arr[i].length - 1);
            arr[i][arr[i].length - 1] = j;
        }
        
        arr[arr.length-1][arr.length - 1] = tmp;
        return arr;
    }
    
    public int[][] shiftRight(int[][] arr, int k) {
        if (k > 0)
            for (int i = 0; i < k; i++) {
                arr = shiftRight(arr);
            }
 
        return arr;
    }
 
    public int[][] shiftRight(int[][] arr) {
        int tmp = arr[arr.length - 1][arr.length - 1];
        for (int i = 0; i < arr.length; i++) {
            int j = tmp;
            tmp = arr[i][arr.length - 1];
            System.arraycopy(arr[i], 0, arr[i], 1, arr[i].length - 1);
            arr[i][0] = j;
        }
        return arr;
    }
}
Собственно, как сделать циклический сдвиг вверх матрицы?

Добавлено через 6 минут
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
int count = 10;
System.out.println("Сдвиг вправо на " + count + " позиций");
* * * * array = e2.shiftRight(array, 2);
Заменить на
Java
1
2
System.out.println("Сдвиг вправо на " + count + " позиций");
* * * * array = e2.shiftRight(array, [B]count[/B]);
Добавлено через 2 часа 5 минут
Решил это так:

Сдвиг вверх: транспонирование, сдвиг влево, транспонирование
Сдвиг вниз: транспонирование, сдвиг вправо, транспонирование

Вот мое решение, если кому понадобится
Кликните здесь для просмотра всего текста

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
package ru.junior_progger;
 
 
/**
 * Ввести с консоли n – размерность матрицы a[n][n]. 
 * Задать значения элемен-тов матрицы в интервале 
 * значений от -n до n с помощью датчика случайных чисел
 * 
 * Выполнить циклический сдвиг заданной матрицы на k позиций 
 * вправо (влево, вверх, вниз).
 */
 
public class Example_2 {
    
    public static void main(String[] args) {
        new Example_2();
    }
    
    public Example_2(){
        //int n = Util.getNumber();
        int [][] array = Util.getMatrix();
        System.out.println("Исходная матрица:");
        Util.print(array);
        int count = 2;
        
        System.out.println("Сдвиг вправо на " + count + " позиций");
        int[][] shiftRight = this.shiftRight(array, count);
        Util.print(shiftRight);
        
        System.out.println("Сдвиг влево на " + count + " позиций");
        int[][] shiftLeft = this.shiftLeft(array, count);
        Util.print(shiftLeft);
        
        System.out.println("Сдвиг вверх на " + count + " позиций");
        int[][] shiftUp = this.shiftUp(array, count);
        Util.print(shiftUp);
        
        System.out.println("Сдвиг вниз на " + count + " позиций");
        int[][] shiftDown = this.shiftDown(array, count);
        Util.print(shiftDown);
        
        
    }
    
    public int[][] shiftDown(int[][] arr, int k){
        if(k == 0)
            return arr;
        else if (k > 0){
            int[][] result = Util.transpone(arr);
            
            for (int i = 0; i < k; i++) {
                result = shiftDown(result);
            }
            return Util.transpone(result);
        } else {
            return shiftUp(arr, -k);
        }
    }
    
    public int[][] shiftDown(int[][] arr) {
        return shiftRight(arr);
    }
    
    public int[][] shiftUp(int[][] arr, int k){
        if(k == 0)
            return arr;
        else if (k > 0){
            int[][] result = Util.transpone(arr);
            
            for (int i = 0; i < k; i++) {
                result = shiftUp(result);
            }
            return Util.transpone(result);
        } else {
            return shiftDown(arr, -k);
        }
    }
    
    public int[][] shiftUp(int[][] arr) {
        return shiftLeft(arr);
    }
 
    public int[][] shiftLeft(int[][] arr, int k) {
        if(k == 0)
            return arr;
        else if (k > 0){
            int[][] result = Util.getCopy(arr);
            
            for (int i = 0; i < k; i++) {
                result = shiftLeft(result);
            }
            return result;
        } else {
            return shiftRight(arr, -k);
        }
    }
    
    public int[][] shiftLeft(int[][] arr) {
        int[][] result = Util.getCopy(arr);
        int tmp = result[0][0];
        for (int i = 0; i < result.length; i++) {
            int j = 0;
            if(i + 1 < result.length)
                j = result[i + 1][0];
            System.arraycopy(result[i], 1, result[i], 0, result[i].length - 1);
            result[i][result[i].length - 1] = j;
        }
        
        result[result.length-1][result.length - 1] = tmp;
        return result;
    }
    
    public int[][] shiftRight(int[][] arr, int k) {
        if(k == 0)
            return arr;
        else if (k > 0){
            int[][] result = Util.getCopy(arr);
            
            for (int i = 0; i < k; i++) {
                result = shiftRight(result);
            }
            return result;
        } else {
            return shiftLeft(arr, -k);
        }
    }
 
    public int[][] shiftRight(int[][] arr) {
        int[][] result = Util.getCopy(arr);
        int tmp = result[result.length - 1][result.length - 1];
        for (int i = 0; i < result.length; i++) {
            int j = tmp;
            tmp = result[i][result.length - 1];
            System.arraycopy(result[i], 0, result[i], 1,
                    result[i].length - 1);
            result[i][0] = j;
        }
        return result;
    }
}
И вспомогательный класс
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
package ru.junior_progger;
 
import java.util.Scanner;
 
public class Util {
    private static Scanner sc = null;
 
    public static int getNumber() {
        int count = 0;
        if (sc == null)
            sc = new Scanner(System.in);
        try {
            System.out.print("Введите n (Целое положительное число)\n-> ");
 
            count = Integer.parseInt(sc.nextLine());
        } catch (Exception e) {
            System.out.println("Oooooooops.\nBye bye!");
            e.printStackTrace();
        }
        return count;
    }
 
    public static int[][] getMatrix(){
        int[][] result = new int[5][5];
        
        int count = 0;
        for (int i = 0; i < result.length; i++) {
            for (int j = 0; j < result[i].length; j++) {
                result[i][j] = ++count;
            }
        }
        
        return result;
    }
    
    public static int[][] getMatrix(int x) {
        int[][] result = new int[x][x];
        
        for (int i = 0; i < result.length; i++) {
            for (int j = 0; j < result[i].length; j++) {
                result[i][j] =(int) (-x  + Math.random() * 2 * x);
            }
        }
        return result;
    }
    
    public static int[][] transpone(int[][] array){
        int[][] tmp = new int[array.length][array.length];
        
        for (int i = 0; i < array[0].length; i++) {
            for (int j = 0; j < array.length; j++) {
                tmp[i][j] = array[j][i];
            }
        }
        
        return tmp;
    }
    
    public  static int[][] getCopy(int[][] source){
        if(source == null)
            return null;
        
        int[][] result = new int[source.length][source.length];
        for (int i = 0; i < result.length; i++)
            System.arraycopy(source[i], 0, result[i], 0, result[i].length);
        
        return result;
    }
    public static void print(int[][] array){
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }
    }
}


Никто не знает, как эту задачу решить без транспонирования?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.08.2013, 17:58
Ответы с готовыми решениями:

с++ задачи на массивы и мартицы
помогите написать код програми: В одномірному масиві, що складається з n дійсних елементів, вирахувати: 1) кількість елементів...

Вычислить определитель вещественной мартицы
Вычислить определитель вещественной мартицы размера N на N. Пользоваться библитоеками #include &lt;stdio.h&gt;, #include&lt;math.h&gt;,...

сортировка четных элементов мартицы
По заданию нужно отсортировать эл матрицы по неубыванию, а сами столбцы по возростанию произведения четных элементов столбцов.вот у меня...

9
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
10.08.2013, 19:22
delete

Добавлено через 23 минуты

Не по теме:

хэх)


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static int[][] shiftUp(final int[][] input, final int k) {
   assert(k >= 0 && k <= input.length);
 
   if ((k == 0) || (k == input.length)) {
      return input;
   }         
      
   final int[][] result = new int[input.length][input[0].length];
 
   for (int j = 0; j != result[0].length; ++j) {
      int i = 0;      
 
      for (int r = k; r != result.length; ++i, ++r) {
         result[i][j] = input[r][j];
      }
 
      for (int r = 0; i != result.length; ++i, ++r) {
         result[i][j] = input[r][j];
      }
   }
 
   return result;
}
0
1 / 1 / 0
Регистрация: 31.12.2012
Сообщений: 15
10.08.2013, 19:29
Цитата Сообщение от gray_fox Посмотреть сообщение
delete

Добавлено через 23 минуты

Не по теме:

хэх)


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static int[][] shiftUp(final int[][] input, final int k) {
   assert(k >= 0 && k <= input.length);
 
   if ((k == 0) || (k == input.length)) {
      return input;
   }         
      
   final int[][] result = new int[input.length][input[0].length];
 
   for (int j = 0; j != result[0].length; ++j) {
      int i = 0;      
 
      for (int r = k; r != result.length; ++i, ++r) {
         result[i][j] = input[r][j];
      }
 
      for (int r = 0; i != result.length; ++i, ++r) {
         result[i][j] = input[r][j];
      }
   }
 
   return result;
}

переменные j,r,k i, не несут в себе смысловых значений, это плохо

Добавлено через 1 минуту
неплохо еще коментариев добавить возле циклов
1
любитель покушать
 Аватар для Севак
687 / 641 / 248
Регистрация: 25.09.2011
Сообщений: 1,313
10.08.2013, 20:14
Almaz_1993, пробуй, будут вопросы - пиши
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
package com.sevak_avet.SevakUtils;
 
import java.util.Arrays;
 
 
public class ArraysMethod {
    public static int[][] shift(int[][] originalArr, Shift shift, int howMuch) {
        int column = originalArr[0].length;
        int row = originalArr.length;
 
        int[][] newArr = new int[row][column];  
 
        if(shift == Shift.LEFT || shift == Shift.RIGHT) {
            howMuch %= column;
        } else {
            howMuch %= row;
        }
        
        if(howMuch == 0) {
            return originalArr;
        }
        
        switch (shift) {
        case LEFT:
            for (int i=0; i<originalArr.length; ++i) {
                System.arraycopy(originalArr[i], howMuch, newArr[i], 0, originalArr[i].length - howMuch);
                System.arraycopy(originalArr[i], 0, newArr[i], originalArr[i].length - howMuch, howMuch);
            }
            
            break;
 
        case RIGHT:         
            for (int i=0; i<originalArr.length; ++i) {
                System.arraycopy(originalArr[i], originalArr[i].length - howMuch, newArr[i], 0, howMuch);
                System.arraycopy(originalArr[i], 0, newArr[i], howMuch, originalArr[i].length - howMuch);
            }
            
            break;
 
        case UP:            
            for(int i=0; i<howMuch; ++i) {
                newArr[originalArr.length - howMuch + i] = Arrays.copyOf(originalArr[i], originalArr[i].length);
            }
            
            for(int i=howMuch; i<originalArr.length; ++i) {
                newArr[i - howMuch] = Arrays.copyOf(originalArr[i], originalArr[i].length);
            }
            
            break;
 
        case DOWN:          
            for(int i=0; i<originalArr.length - howMuch; ++i) {
                newArr[i + howMuch] = Arrays.copyOf(originalArr[i], originalArr[i].length);
            }
            
            for(int i = originalArr.length - howMuch; i<originalArr.length; ++i) {
                newArr[i - originalArr.length + howMuch] = Arrays.copyOf(originalArr[i], originalArr[i].length);
            }
            
            break;
        }
 
        return newArr;
    }
 
    public static void main(String[] args) {
        int[][] arr = { { 1,2,3,4 }, {5, 6,7,8}, { 9,10,11,12}, { 13,14,15,16 }};
 
        for (int[] x : arr) {
            System.out.println(Arrays.toString(x));
        }
 
        int[][] newArr = shift(arr, Shift.DOWN, 0);
        
        System.out.println();
        for (int[] x : newArr) {
            System.out.println(Arrays.toString(x));
        }               
    }
}
Java
1
2
3
4
5
package com.sevak_avet.SevakUtils;
 
public enum Shift {
    LEFT, RIGHT, UP, DOWN
}
Добавлено через 21 минуту
Цитата Сообщение от gray_fox Посмотреть сообщение
Java
1
if ((k == 0) || (k == input.length)) {
а что если k = x * input.length, где x - некое положительное число? отработает вариант только с x=1, хотя должно быть пофиг
2
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
10.08.2013, 20:23
Цитата Сообщение от Севак Посмотреть сообщение
а что если k = x * input.length, где x - некое положительное число? отработает вариант только с x=1, хотя должно быть пофиг
Предлагаете принимать любое неотрицательное число в качестве сдвига?
Java
1
2
3
4
assert(shift >= 0);
 
shift %= input.length;
if (shift == 0) { /* ... */ }
0
любитель покушать
 Аватар для Севак
687 / 641 / 248
Регистрация: 25.09.2011
Сообщений: 1,313
10.08.2013, 20:26
gray_fox, я думаю да
0
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
11.08.2013, 02:04  [ТС]
Севак, Спасибо, но почему то, мне
кажется у тебя чуток неправильно работает циклический сдвиг: у тебя сдвигается строка целиком как один элемент.


0
любитель покушать
 Аватар для Севак
687 / 641 / 248
Регистрация: 25.09.2011
Сообщений: 1,313
11.08.2013, 10:41
Almaz_1993, ну дык а что означает сдвиг вниз или вверх? в случае лево/право мы же двигали столбцы
0
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
11.08.2013, 16:12  [ТС]
Цитата Сообщение от Севак Посмотреть сообщение
Almaz_1993, ну дык а что означает сдвиг вниз или вверх? в случае лево/право мы же двигали столбцы
Вот задание: Выполнить циклический сдвиг заданной матрицы на k позиций вправо (влево, вверх, вниз).
Я думал, что циклический сдвиг матрицы осуществляется сдвигом каждого элемента A(i,j).
Посмотрите как у меня.

А у тебя получается, что элементом матрицы является не числа, а другой массив.
0
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
11.08.2013, 17:36  [ТС]
Не тот скреен скинул, вот правильный
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2013, 17:36
Помогаю со студенческими работами здесь

Как в Delphi 7 перемножить мартицы?
Здравствуйте, прошу помочь с задачей: Заданы матрицы А(n,m) и B(m,l). Перемножить этим матрицы. Не знаю как это сделать в Delphi...

Логический сдвиг влево,логический сдвиг вправо,алгоритм обмена двух переменных,циклический сдвиг
Битовые сдвиги.FW4,msstudio 13,на C# 1)Реализовать быстрое умножение на 2(логический сдвиг влево) 2)Реализовать быстрое деление на...

Расположить столбцы мартицы в порядке возрастания k строки
Добрый день. Есть задача, я даже не могу понять что от меня требуется, надеюсь на помощь. Расположить столбцы матрицы D(mxn) в порядке...

Где и когда уместно применять операции << (сдвиг влево) и >> (сдвиг вправо)?
Кто может привести пример , когда нужно использовать операции: 1) &lt;&lt; сдвиг влево 2) &gt;&gt; сдвиг вправо

Вычислить количество элементов, которые равны среднему арифметическому максимального и минимального элементов мартицы
Есть действительно матрица порядка n × m. Вычислить количество элементов, которые равны среднему арифметическому максимального и...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru