import java.util.StringTokenizer; import java.io.*; public class probb{ final static int B = -5; final static int C = 6; final static int E = 3; final static int F = -2; final static int M = 1; final static int O = 2; final static int EMPTY = 0; static int dataset; static int[][] output; static int[][][][] totalSum; public static void main (String[] args){ try { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String newline = reader.readLine(); int numData = (new Integer(newline)).intValue(); for (dataset = 1; dataset <= numData; dataset++){ newline = reader.readLine(); StringTokenizer token = new StringTokenizer(newline); int numLines = (new Integer(token.nextToken())).intValue(); int numItems = (new Integer(token.nextToken())).intValue(); output = new int[numItems][numLines]; for (int i = 0; i < numLines; i++){ String nextline = reader.readLine(); for (int j = 0; j < numItems; j++){ switch(nextline.charAt(j)){ case 'B': output[j][i] = B; break; case 'C': output[j][i] = C; break; case 'E': output[j][i] = E; break; case 'F': output[j][i] = F; break; case 'M': output[j][i] = M; break; case 'O': output[j][i] = O; break; default: output[j][i] = 0; } } } writeOutput(); } } catch(Exception e){System.out.println(e);} } //brute force public static void writeOutput(){ // totalSum = new int[output.length][output[0].length][output.length][output[0].length]; // sumAll(output.length,output[0].length,output.length,output[0].length); int max = 0; int bestA = 0, bestB = 0, bestC = 0, bestD = 0; for (int a = 0; a < output.length; a++){ for (int b = 0; b < output[0].length; b++){ for (int c = 0; c < output.length; c++){ for (int d = 0; d < output[0].length; d++){ int sum = 0; for (int i = a; i <= c; i++){ for (int j = b; j <= d; j++){ sum += output[i][j]; } } //System.out.println(a + " " + b + " " + c + " " + d + " sum = " + sum); if (sum > max){ bestA = a+1; bestB = b+1; bestC = c+1; bestD = d+1; max = sum; } } } } } if (max > 0) { System.out.println("Data set " + dataset + ": grove (" + bestB + ", " + bestA + ") (" + bestD +", " + bestC + ") has quality " + max); } else { System.out.println("Data set " + dataset + ": no grove has a positive score"); } System.out.println(""); } //dynamic programming public static int sumAll(int a, int b, int c, int d){ if (a==c && b==d){ totalSum[a][b][c][d] = output[a][b]; } else if (b==d) { totalSum[a][b][c][d] = sumAll(a,b,c-1,d) + sumAll(c,d,c,d); } else if (a==c){ totalSum[a][b][c][d] = sumAll(a,b,c,d-1) + sumAll(c,d,c,d); } else { totalSum[a][b][c][d] = sumAll(a,b,c-1,d) + sumAll(c,b,c,d); } return totalSum[a][b][c][d]; } }