Løsningsforslag - oppgaver i Avsnitt 1.6.4


Oppgave 1

  public static void vertikal(int[][] a)
  {
    int m = a.length;     // antall rader

    int v = 0, h = a[0].length - 1;

    while (v < h)
    {
      for (int i = 0; i < m; i++)
      {
        int temp = a[i][v];
        a[i][v] = a[i][h];
        a[i][h] = temp;
      }

      v++; h--;
    }
  }

Oppgave 2

  public static int[][] transponert(int[][] a)
  {
    // a må være regulær, dvs. alle radene må
    // ha samme lengde

    int m = a.length;     // antall rader
    int n = a[0].length;  // antall kolonner

    int[][] b = new int[n][m];

    for (int i = 0; i < m; i++)
    {
      if (a[i].length != n) throw new
        IllegalArgumentException("Tabellen a er ikke regulær!");

      for (int j = 0; j < n; j++) b[j][i] = a[i][j];
    }

    return b;
  }

Oppgave 3

En bidiagonal speiling kan vi få til ved å ta først en horisontal speiling, så en vertikal speiling og til slutt en diagonal speiling:

  public static void bidiagonal(int[][] a)  // diagonal speiling
  {
    horisontal(a);
    vertikal(a);
    diagonal(a);
  }

Vi får imidlertid en mer effektiv metode hvis speilingen kodes direkte:

  public static void bidiagonal(int[][] a)  // diagonal speiling
  {
    int n = a.length;

    for (int i = 0; i < n; i++)
    {
      if (a[i].length != n) throw new
        IllegalArgumentException("Tabellen er ikke kvadratisk!");

      for (int j = n - i - 2; j >= 0; j--)
      {
        int temp = a[i][j];  // bytter om a[i][j] og a[n-1-j][n-1-i]
        a[i][j] = a[n-1-j][n-1-i];
        a[n-1-j][n-1-i] = temp;
      }
    }
  }

Oppgave 4

  public static int[][] roter90(int[][] a)
  {
    // a må være regulær, dvs. alle radene må
    // ha samme lengde

    int m = a.length, n = a[0].length;

    int[][] b = new int[n][m];

    for (int i = 0; i < a.length; i++)
    {
      if (a[i].length != n) throw new
        IllegalArgumentException("Tabellen a er ikke regulær!");

      for (int j = 0; j < n; j++)
        b[j][m - 1 - i] = a[i][j];
    }

    return b;
  }

Oppgave 5

En rotasjon på 180o med klokken kan vi få til ved å ta først en horisontal speiling og så en vertikal speiling:

  public static void roter180(int[][] a)
  {
    horisontal(a);
    vertikal(a);
  }

Vi får imidlertid en mer effektiv metode hvis rotasjonen kodes direkte:

  public static void roter180(int[][] a)
  {
    int m = a.length, n = a[0].length;

    for (int i = 0; i < m/2; i++)
    {
      if (a[i].length != n || a[m - 1 - i].length != n) throw new
        IllegalArgumentException("Tabellen a er ikke regulær!");

      for (int j = 0; j < n; j++)
      {
        int temp = a[i][j];
        a[i][j] = a[m - 1 - i][n - 1 - j];
        a[m - 1 - i][n - 1 - j] = temp;
      }

      if ((m & 1) != 0)  // m er odde
      {
         if (a[m/2].length != n) throw new
           IllegalArgumentException("Tabellen a er ikke regulær!");

         int v = 0, h = n - 1;
         while (v < h)
         {
           int temp = a[m/2][v];
           a[m/2][v] = a[m/2][h];
           a[m/2][h] = temp;
           v++; h--;
         }
      }
    }
  }

Oppgave 6

  public static void roter270(int[][] a)
  {
    diagonal(a);
    horisontal(a);
  }

Oppgave 7

  public static int[][] roter180(int[][] a)
  {

    // a må være regulær, dvs. alle radene må
    // ha samme lengde

    int m = a.length;     // antall rader
    int n = a[0].length;  // antall kolonner

    int[][] b = new int[m][n];

    for (int i = 0; i < m; i++)
    {
      if (a[i].length != n) throw new
        IllegalArgumentException("Tabellen a er ikke regulær!");

      for (int j = 0; j < n; j++) b[i][j] = a[m-1-i][n-1-j];
    }

    return b;
  }

Oppgave 8

  public static int[][] roter270y(int[][] a)
  {

    // a må være regulær, dvs. alle radene må
    // ha samme lengde

    int m = a.length;     // antall rader
    int n = a[0].length;  // antall kolonner

    int[][] b = new int[n][m];

    for (int i = 0; i < m; i++)
    {
      if (a[i].length != n) throw new
        IllegalArgumentException("Tabellen a er ikke regulær!");

      for (int j = 0; j < n; j++) b[n-1-j][i] = a[i][j];
    }

    return b;
  }