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; }