1. JAVA, Gunnar Hage

/**
* ACM programming Contest WS 08/09 "469 - Wetlands of Florida"
* Verdict: Runtime Error
*
* Gunnar Hage, AP5(IFB5A) Nov. 2008 * Gunnar Hage, gunnarhage@gmx.de
* AP5(IFB5A) Nov. 2008
*
* Aufgabe: http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&Itemid=8&category=6&page=show_problem&problem=410
* Sample Input
1

LLLLLLLLL
LLWWLLWLL
LWWLLLLLL
LWWWLWWLL
LLLWWWLLL
LLLLLLLLL
LLLWWLLWL
LLWLWLLLL
LLLLLLLLL
3 2
7 5

Sample Output

12
4
*/
//package p469_Wetlands_of_Florida;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
static boolean[][] backup = new boolean[102][];
static boolean[][] wetland;

public static void main(String... args) throws IOException{
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer temp = new StringTokenizer(ReadLn(5));
int wetlandCount = Integer.parseInt(temp.nextToken());
ReadLn(10);// eine Zeile flushen.
for(int k=1;k<=wetlandCount;k++)
{
printWetland(br);
}

br.flush();
System.exit(0);
}

static void printWetland(BufferedWriter br) throws IOException{
backup = new boolean[102][];
boolean[] line;
int inputX[] = new int[10000]; // ich schätze, das kein Testfall mehr als 10000 Abfragen bekommt
int inputY[] = new int[10000];
int countLines=0;
String temp = ReadLn(101);// Die erste Zeile
//einlesen des Spielfelds
while(temp.charAt(0) == 'W' || temp.charAt(0) == 'L')
{
temp = "L" + temp + "L";
line = new boolean[temp.length()];
for(int i=0;i<line.length;i++){
line[i] = (temp.charAt(i)=='W'); // Wasser = true / Land = false
}
backup[countLines] = line;
temp = ReadLn(101);
countLines++;
}
//zum umgeben des Arrays mit Land +1
wetland = new boolean[countLines+2][];
wetland[0] = new boolean[100];
wetland[wetland.length-1] = new boolean[100];
for(int i=1;i<wetland.length-1;i++)
wetland[i]=backup[i-1];
//clonen weil der Algorithmus das Array verändert und mehrere Abfragen auf ein "wetland" gehen können.
backup = wetland.clone();

//einlesen des Spielfelds beendet. In backup und wetlands liegt jetzt das Spielfeld mit Landrand
//jetzt Abfragecoordinaten einlesen.
int outputCount=0;
while(temp != null && temp != "")
{
StringTokenizer st = new StringTokenizer(temp);
inputX[outputCount] = Integer.parseInt(st.nextToken());
inputY[outputCount++] = Integer.parseInt(st.nextToken());
temp = ReadLn(101);
}
for(int k=0; k<outputCount;k++){
br.write(ls(inputX[k], inputY[k]) + "\n");
wetland = backup.clone();
}
br.append('\n');//blank line nach einer Outpureihe für ein Feld
}
// LLLLLLL
// LakeSize aufwändig, wenn man nicht sicher sagen kann, das die Ränder Land sind. viel arbeit. WLWWL ->LWLWWLL
// desshalb verändere ich die boolarrays so, das sie immer von einem Landsteg umgeben sind. LLWLW ->LLLWLWL
// LLLLLLL
static int ls(int x, int y){
if(wetland[x][y]){
wetland[x][y] = false;
return 1+ls(x-1,y-1)+ls(x,y-1)+ls(x+1,y-1)+ls(x-1,y)+ls(x+1,y)+ls(x-1,y+1)+ls(x,y+1)+ls(x+1,y+1);
}
return 0;
}

static String ReadLn (int maxLg) // utility function to read from stdin
{
byte lin[] = new byte [maxLg];
int lg = 0, car = -1;
try
{
while (lg < maxLg)
{
car = System.in.read();
if ((car < 0) || (car == '\n')) break;
lin [lg++] += car;
}
}
catch (IOException e)
{
return (null);
}
if(lg>0)
if (lin[lg-1]=='\r' || lin[lg-1] == 13)
lg--;
if (car < 0 || lg==0) return (null); // eof
return (new String (lin, 0, lg));
}
}