HelpMeWithTheGame
POJ-2996
写的比较长,逻辑总共三部分,printWhite和printBlack逻辑大致相同,只有几行的差异。
- 将给定棋盘精简
- printWhilte(重载comparator的compare)
- printBlack
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class HelpMeWithTheGame {
static char[][] matrix;
static char[] column = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };
static int[] row = { 8, 7, 6, 5, 4, 3, 2, 1 };
public static void main(String[] args) {
// TODO Auto-generated method stub
input();
printWhite();
printBlack();
}
private static void printBlack() {
String arr[] = new String[30];
int index = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (matrix[i][j] >= 'a' && matrix[i][j] <= 'z') {
String temp = new String("");
if (matrix[i][j] != 'p') {
temp += (char) (matrix[i][j] - 32);
}
temp += column[j];
temp += row[i];
arr[index++] = temp;
}
}
}
int count = index;
String temp[] = new String[count];
for (int i = 0; i < temp.length; i++) {
temp[i] = arr[i];
}
Arrays.sort(temp, new Comparator<String>() {
@Override
// KQRBNP,类型优先,行大优先,同类同行列小优先
public int compare(String o1, String o2) {
char f1 = o1.charAt(0), f2 = o2.charAt(0);
// 类别比较
if ((f1 != f2 && o1.length() == 3 && o2.length() == 3) || o1.length() != o2.length()) {
// 含P
if (o1.length() < o2.length()) {
return 1;
} else if (o1.length() > o2.length()) {
return -1;
}
// 不含P
if (f1 == 'K')
return -1;
else if (f1 == 'Q' && (f2 == 'R' || f2 == 'B' || f2 == 'N'))
return -1;
else if (f1 == 'R' && (f2 == 'B' || f2 == 'N'))
return -1;
else if (f1 == 'B' && f2 == 'N')
return -1;
else
return 1;
}
// 行比较
// KQRBNP,类型优先,行小优先,同类同行列小优先
int r1 = -1, r2 = -1;
if (f1 >= 'A' && f1 <= 'Z')
r1 = o1.charAt(2);
else
r1 = o1.charAt(1);
if (f2 >= 'A' && f2 <= 'Z')
r2 = o2.charAt(2);
else
r2 = o2.charAt(1);
if (r1 < r2)
return 1;
else if (r1 > r2)
return -1;
// 列比较
char c1 = '-', c2 = '-';
if (f1 >= 'A' && f1 <= 'Z')
c1 = o1.charAt(1);
else
c1 = o1.charAt(0);
if (f2 >= 'A' && f2 <= 'Z')
c2 = o2.charAt(1);
else
c2 = o2.charAt(0);
if (c1 < c2)
return -1;
else
return 1;
}
});
for (int i = 0; i < index; i++) {
if (i == 0) {
System.out.print("Black: " + temp[i]);
} else {
System.out.print("," + temp[i]);
}
}
System.out.println();
}
private static void printWhite() {
// Ke1,Qd1,Ra1,Rh1,Bc1,Bf1,Nb1,a2,c2,d2,f2,g2,h2,a3,e4
String arr[] = new String[30];
int index = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (matrix[i][j] >= 'A' && matrix[i][j] <= 'Z') {
String temp = new String("");
if (matrix[i][j] != 'P') {
temp += matrix[i][j];
}
temp += column[j];
temp += row[i];
arr[index++] = temp;
}
}
}
int count = index;
String temp[] = new String[count];
for (int i = 0; i < temp.length; i++) {
temp[i] = arr[i];
}
Arrays.sort(temp, new Comparator<String>() {
@Override
// KQRBNP,类型优先,行小优先,同类同行列小优先
public int compare(String o1, String o2) {
char f1 = o1.charAt(0), f2 = o2.charAt(0);
// 类别比较
if ((f1 != f2 && o1.length() == 3 && o2.length() == 3) || o1.length() != o2.length()) {
// 含P
if (o1.length() < o2.length()) {
return 1;
} else if (o1.length() > o2.length()) {
return -1;
}
// 不含P
if (f1 == 'K')
return -1;
else if (f1 == 'Q' && (f2 == 'R' || f2 == 'B' || f2 == 'N'))
return -1;
else if (f1 == 'R' && (f2 == 'B' || f2 == 'N'))
return -1;
else if (f1 == 'B' && f2 == 'N')
return -1;
else
return 1;
}
// 行比较
// KQRBNP,类型优先,行小优先,同类同行列小优先
int r1 = -1, r2 = -1;
if (f1 >= 'A' && f1 <= 'Z')
r1 = o1.charAt(2);
else
r1 = o1.charAt(1);
if (f2 >= 'A' && f2 <= 'Z')
r2 = o2.charAt(2);
else
r2 = o2.charAt(1);
if (r1 < r2)
return -1;
else if (r1 > r2)
return 1;
// 列比较
char c1 = '-', c2 = '-';
if (f1 >= 'A' && f1 <= 'Z')
c1 = o1.charAt(1);
else
c1 = o1.charAt(0);
if (f2 >= 'A' && f2 <= 'Z')
c2 = o2.charAt(1);
else
c2 = o2.charAt(0);
if (c1 < c2)
return -1;
else
return 1;
}
});
for (int i = 0; i < index; i++) {
if (i == 0) {
System.out.print("White: " + temp[i]);
} else {
System.out.print("," + temp[i]);
}
}
System.out.println();
}
// 简化二维矩阵
private static void input() {
Scanner sc = new Scanner(System.in);
matrix = new char[8][33];
sc.nextLine();
for (int i = 0; i < matrix.length; i++) {
matrix[i] = sc.nextLine().toCharArray();
sc.nextLine();
}
for (int i = 0; i < matrix.length; i++) {
int index = 2;
for (int j = 0; j < 8; j++) {
matrix[i][j] = matrix[i][index];
index += 4;
}
}
}
}