Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Java] Сокращение двумерной матрицы


Автор: SERJ2006 5.4.2012, 22:53
требуется написать программу, которая будет сравнивать 2 столбца двумерного массива, и векторно меньший копировать другой двумерный массив. идея такая: создаем два двумерных массива. инициализируем первый. сравниваем первый элемент столбца и второй в первой строчке, если первый больше присваиваем некоторой переменной k=0, переходим на следующую строчку и также проверяем первый и второй элемент, если также больше, то двигаемся к следующей строчке, и так до последней строки. если 1 столбец полностью больше, то второй столбец копирум в новый массив.
 если же при сравнивании в одной строке 1 элементы столбца больше 2, но во второй строчке наоборот, то переходить к следующему столбцу.
 проверку производить до последнего столбца.
вот программа, но оно тупо копирует массив A в B. а должно в моем приеме оставаться только
1 0 1
1 1 0
Код

public class DM{
 public static void  main(String[]args){
  int [][]A={       {1, 0, 1},
                    {1, 1, 0},
                    {1, 0, 0}
            };
  int [][]B=new int [3][3];//сдесь правильнее будет указать размер массива A.length
    int k=0;
    int l=A.length;
    for (int i=1;i<A.length-1;i++){
      for (int j=1;j<A[i].length-1;j++){
        if (A [i][j]>A [i][j+1]){k=1;}
        if (A [i][j]<A [i][j+1]){k=0;}   
        i++;
        if (k==1){
          //копирование массивов
          for (int s=0;s<l;s++){
             for (int n=0;n<l;n++){
               B [s][n]=A [s][n];
             }
          }
        }
        if (k==0) j++;
      }
    }  
    
  System.out.println("Изначальный массив: ");
    //вывод массива
     for (int i=0;i<A.length;i++){
      for (int j=0;j<A[i].length;j++)
      System.out.print(A[i][j]+" ");
      System.out.println();
     }
  System.out.println("Новый массив: ");
   for (int i=0;i<B.length;i++){
     for (int j=0;j<B[i].length;j++){
      System.out.print(B[i][j]+" ");
      System.out.println();
     }
   }
}
}

помогите пожалуйста ее доделать!

Автор: jk1 6.4.2012, 09:28
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: Mirkes 6.4.2012, 19:58
Цитата(SERJ2006 @  5.4.2012,  22:53 Найти цитируемый пост)
    for (int i=1;i<A.length-1;i++){

А почему не сравниваете элементы первой строки? И почему не сравниваете элементы последней строки?
Сравнение работает только по второй строке.

Цитата(SERJ2006 @  5.4.2012,  22:53 Найти цитируемый пост)
        i++;

Цитата(SERJ2006 @  5.4.2012,  22:53 Найти цитируемый пост)
        if (k==0) j++;

А вот за такие вещи в циклах for бьют канделябрами!

Вобщем текст - полный бред. Что вы пытались сэкономить?
Ведь в описании алгоритма вы по человечески описали, что нужно сделать, а в тексте программы?

Что должно происходить при равенстве элементов?
Что будет если первый столбец меньше второго?
Почему вы предлагаете сравнивать столбцы, а сравниваете строки?

Если прочитать задачу следующим образом:
Сравнить попарно все столбцы матрицы A. Если все элементы столбца i меньше всех элементов одного из других столбцов, то скопировать столбец i во вторую матрицу.
Для такой задачи реализация может быть следующей:
Код

public class DM{
 public static void  main(String[]args){
  int [][]a={  {1, 0, 1},  // в Java имена переменных начинают с маленькой буквы. 
                    {1, 1, 0},
                    {1, 0, 0}
                    {1, 0, 0}   // Добавил одну строку, чтобы не было соблазна считать матрицу квадратной, о чем в условии нет ни слова.
            };
  int [][] b =new int [a.length][a[0].length];//сдесь правильнее будет указать размер массива a.length
  int [] cop = new int [a[0].length];  // индикатор того, что столбец уже копировался
    for (int i=0;i<cop.length;i++){
        cop[i]=0;
    }
    int more,less,eq;  // переменные для остлеживания исходов 
    int n=0; // номер столбца, куда копировать
    for (int j=0;j<a[0].length-1;j++){  // номер первого из сравниваемых столбцов
      for (int k=J+1;k<a[0].length;k++){ // номер иторого из сравниваемых столбцов
         more=0;  // никто не был больше
         less=0;    // никто не был меньше
         eq=0;      // никто не был равен
         for (int i=0;i<a.length;i++) {  // номер строки
            if (a [i][j]>A [i][k]){
                more++;
            } else if (A [i][j]<A [i][k]){
                less++;
           } else
                eq++;
         }
         // анализируем, нужно ли копировать
         if (eq==0){  // копировать стоит только если не было равных элементов
           if (more>0 && less==0 && cop[k]=0){  // копируем второй из столбцов, если ранее он не копировался
              for (int i=0;i<a.length;i++){
                 b[i][n]=a[i][k];
              }
              cop[k]=1;
              n++;
           }
           if (more==0 && less>0 && cop[j]=0){  // копируем первый из столбцов, если ранее он не копировался
              for (int i=0;i<a.length;i++){
                 b[i][n]=a[i][j];
              }
              cop[j]=1;
              n++;
           }
         }
      }
    }  
    
  System.out.println("Изначальный массив: ");
    //вывод массива
     for (int i=0;i<a.length;i++){
      for (int j=0;j<a[i].length;j++)
        System.out.print(a[i][j]+" ");
      System.out.println();
     }
  System.out.println("Новый массив: ");
   for (int i=0;i<b.length;i++){
     for (int j=0;j<n;j++){
       System.out.print(b[i][j]+" ");
     System.out.println();
     }
   }
}
}

Код не проверял. писал по месту

Автор: SERJ2006 9.4.2012, 18:12
извините, со строчками ошибся. если элементы равны продолжать сравнение элементов столбцов в другой строчке. если первый столбец меньше второго, то первый уже сравнивать с третим, если нельзя сравнивать(к примеру в первом столбце первый элемент строки больше второго элемента второго столбца, тойже строчки, а элемент 1 столбца 2 строчки меньше элемента 2 столбца второй строки, то заносить два столбца в новый массив.

Добавлено через 1 минуту и 54 секунды
вот алгаритм:
0) Считаем исходную таблицу покрытий текущей, а множество ядерных строк – пустым.
1) Находим ядерные строки, запоминаем множество ядерных строк. Текущую таблицу покрытий сокращаем, вычеркивая ядерные строки и все столбцы, покрытые ими.
2) Вычеркиваем антиядерные строки.
3) Вычеркиваем поглощающие столбцы.
4) Вычеркиваем поглощаемые строки.
5) Если в результате выполнения пунктов с 1 по 4 текущая таблица покрытий изменилась, снова выполняем пункт 1, иначе преобразование заканчиваем.
Поэтому алгоритм работы следующий:
1) ввод числа строк и столбцов таблицы покрытия;
2) ввод таблицы покрытия ;
3) поиск ядерных строк. Если их нет, то п.4. Иначе, запоминаем эти ядерные строки. Ищем столбцы, покрытые ядерными строками. Вычеркиваем все ядерные строки и столбцы, покрытые ими.
4) вычеркивание антиядерных строк. Переход в п.5.
6) вычеркивание поглощающих столбцов.
7) вычеркивание поглощаемых строк.
8) если в результате преобразований таблица покрытий изменилась, выполняем пункт 3. Иначе - вывод множества покрытия, конец алгоритма.

Добавлено через 4 минуты и 27 секунд
ядерная - это когда в таблице строчка или столбец, содержащий одну еденицу, если ядерная строка, то мы ее вычеркиваем, и все поглащаемые ею строки, и запоминаем. если столбец, то поглощаем(если есть чем).

Добавлено через 6 минут и 15 секунд
требуется написать программу, которая будет сокращать марицу(через двумерный массив), т.е. результаты записывать в другой массив.
 1) нужно через цикл for сделать, чтобы сокращалось по принципу:  
 1 0 1 0 
 0 1 1 1
 0 0 0 1

 сокращение столбцов: сравнивать 2 столбца, и меньший столбец(разность должна быть в 1 еденице) заносится в новую матрицу, большие не заносятся. а не сравниваемые, заносятся
 результат после сокращения таков:
 2 столбец поглощает четвертый, первый поглощает третий.
1 0
0 1
0 0

2)метод, который выполняет сокращение по строкам( из оставшихся элементов)
 только сдесь большая заносится в новый массив, а меньшая нет.
 например:
1 0 0
0 1 1
0 1 0

2 строка поглощает 3 
 результат:
1 0 0
0 1 1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)