import java.io.*;
import java.util.ArrayList;
public interface Assignment1 {
public long minesweep(File inputfile);
public static void main(String[] args) throws FileNotFoundException {
BufferedReader br;
int summeAllerZahlen = 0;
ArrayList<String> dateiInhalt = new ArrayList<String>();
ArrayList<char[][]> arrays = new ArrayList<char[][]>();
// Fuer die Arrays mit den neuen Feldern (fuer Output) wird int als
// Datentyp verwendet. Alternativ kann mit einem char-Array und
// ASCII-Tabelle (
// http://www.chip.de/ii/1/2/5/4/9/5/8/0/ascii-93c823e7009f26b0.png )
// gearbeitet werden.
ArrayList<int[][]> arraysNEU = new ArrayList<int[][]>();
// Die Datei wird eingelesen und der komplette Inhalt wird in einer
// ArrayList gespeichert.
try {
br = new BufferedReader(new FileReader("input.txt"));
try {
String x;
// Die Schleife wird fuer alle Zeilen in der Datei
// durchlaufen.
while ((x = br.readLine()) != null) {
// trim entfernt fuehrende und nachfolgende Leerzeichen
x = x.trim();
if (x.equals("") == false) {
dateiInhalt.add(x);
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
// Nun wird die ArrayList mit dem Dateiinhalt durchgeguckt und geschaut,
// ob die einzelnen Zeilen Ziffern enthalten. Aufgrund der Informationen
// werden arrays erstellt (aber noch nicht befuellt) und zu
// einer ArrayList namens arrays hinzugefuegt.
for (int i = 0; i < dateiInhalt.size(); i++) {
String einzelneZeile = dateiInhalt.get(i);
if (StringEnthaeltMindestensEineZiffer(einzelneZeile) == true) {
// In solch einer Zeile sind ja zwei Werte hinterlegt. Diese
// sind durch ein Leerzeichen getrennt. Mithilfe der
// split-Methode koennen die Werte herausgepickt werden.
String[] hoeheUndBreite = einzelneZeile.split(" ");
int height = Integer.parseInt(hoeheUndBreite[0]);
int width = Integer.parseInt(hoeheUndBreite[1]);
if (height > 0 && width > 0) {
char[][] feld = new char[height][width];
arrays.add(feld);
int[][] feldNEU = new int[height][width];
arraysNEU.add(feldNEU);
}
}
}
int wievielteZeileMitAngabenZuHoeheUndBreite = 0;
// Nun wird die ArrayList nochmals durchgeguckt und es werden die arrays
// befuellt.
for (int i = 0; i < dateiInhalt.size(); i++) {
String einzelneZeile = dateiInhalt.get(i);
if (StringEnthaeltMindestensEineZiffer(einzelneZeile) == true) {
wievielteZeileMitAngabenZuHoeheUndBreite++;
if (wievielteZeileMitAngabenZuHoeheUndBreite > arrays.size()) {
continue;
}
char[][] array = arrays.get(wievielteZeileMitAngabenZuHoeheUndBreite - 1);
int height = array.length;
int width = array[0].length;
if (height > 0 && width > 0) {
for (int k = 1; k < height + 1; k++) {
String ganzeZeileMitPunktenUndSternen = dateiInhalt.get(i + k);
for (int m = 0; m < width; m++) {
array[k - 1][m] = ganzeZeileMitPunktenUndSternen.charAt(m);
}
}
}
}
}
for (int p = 0; p < arrays.size(); p++) {
char[][] aktuellesArray = arrays.get(p);
int height = aktuellesArray.length;
int width = aktuellesArray[0].length;
int[][] aktuellesArrayNEU = arraysNEU.get(p);
// Nun wird fuer jedes Kaestchen geschaut, wieviele
// Nachbar-Kaestchen Minen haben.
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
// Falls das Kaestchen eine Mine enthaelt wird -1
// gespeichert.
if (aktuellesArray[i][j] == '*') {
aktuellesArrayNEU[i][j] = -1;
}
else {
int anzahlMinen = 0;
// Es muessen die acht Nachbarfelder betrachtet werden.
// Davor muss jedoch geschaut werden, ob es solch ein
// Nachbarfeld ueberhaupt gibt. Das Feld oben links hat
// z.B. keinen Nachbarn oben, keinen Nachbarn links und
// keinen Nachbarn oben links.
// Oben links
if (i > 0 && j > 0) {
if (aktuellesArray[i - 1][j - 1] == '*') {
anzahlMinen++;
}
}
// Oben
if (i > 0) {
if (aktuellesArray[i - 1][j] == '*') {
anzahlMinen++;
}
}
// Oben rechts
if (i > 0 && j < width - 1) {
if (aktuellesArray[i - 1][j + 1] == '*') {
anzahlMinen++;
}
}
// Links
if (j > 0) {
if (aktuellesArray[i][j - 1] == '*') {
anzahlMinen++;
}
}
// Rechts
if (j < width - 1) {
if (aktuellesArray[i][j + 1] == '*') {
anzahlMinen++;
}
}
// Unten links
if (i < height - 1 && j > 0) {
if (aktuellesArray[i + 1][j - 1] == '*') {
anzahlMinen++;
}
}
// Unten
if (i < height - 1) {
if (aktuellesArray[i + 1][j] == '*') {
anzahlMinen++;
}
}
// Unten rechts
if (i < height - 1 && j < width - 1) {
if (aktuellesArray[i + 1][j + 1] == '*') {
anzahlMinen++;
}
}
aktuellesArrayNEU[i][j] = anzahlMinen;
}
}
}
int summeAllerZahlenEinesArrays = 0;
// Die Summe der Zahlen berechnen.
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (aktuellesArrayNEU[i][j] > 0) {
summeAllerZahlenEinesArrays += aktuellesArrayNEU[i][j];
}
}
}
summeAllerZahlen += summeAllerZahlenEinesArrays;
System.out.print(HoleDieSoundsovielteZeileMitAngabenZuHoeheUndBreite(dateiInhalt, p + 1));
System.out.print(" Field: " + summeAllerZahlenEinesArrays + "\n");
for (int i = 0; i < height; i++) {
// In der Ausgabe sollen beide Tabellen nebeneinander sein. Dazu
// werden zwei for-Schleifen benoetigt.
for (int j = 0; j < width; j++) {
System.out.print(aktuellesArray[i][j]);
}
// Zwei Leerzeichen
System.out.print(" ");
for (int j = 0; j < width; j++) {
// Falls der Wert -1 ist soll ein Sternchen ausgegeben
// werden. Anderenfalls soll der Wert ausgegeben werden.
if (aktuellesArrayNEU[i][j] == -1) {
System.out.print("*");
} else {
System.out.print(aktuellesArrayNEU[i][j]);
}
}
// Zeilenumbruch
System.out.print("\n");
}
}
for (int i = 0; i < dateiInhalt.size(); i++) {
if (dateiInhalt.get(i).equals("0 0")) {
System.out.print(dateiInhalt.get(i) + " " + summeAllerZahlen);
}
}
}
public static boolean StringEnthaeltMindestensEineZiffer(String einzelneZeile) {
for (int i = 0; i < einzelneZeile.length(); i++) {
Character c = einzelneZeile.charAt(i);
// Sobald eine Ziffer gefunden worden ist wird true zurueckgegeben.
if (Character.isDigit(c)) {
return true;
}
}
return false;
}
public static String HoleDieSoundsovielteZeileMitAngabenZuHoeheUndBreite(ArrayList<String> dieArrayList, int n) {
int wievielteZeileMitAngabenZuHoeheUndBreite = 0;
for (int i = 0; i < dieArrayList.size(); i++) {
if (StringEnthaeltMindestensEineZiffer(dieArrayList.get(i))) {
wievielteZeileMitAngabenZuHoeheUndBreite++;
}
if (n == wievielteZeileMitAngabenZuHoeheUndBreite) {
return dieArrayList.get(i);
}
}
return null;
}
}