1 / 1
Apr 2016

public static void main(String[] args) {
try{
Scanner sc = new Scanner(System.in);
int m, n;
int dem2 = 0;
ArrayList ketqua = new ArrayList<>();

        n = sc.nextInt();
        m = sc.nextInt();
        while (m != 0 && n != 0) {

            boolean[][] nm = new boolean[n][m];
            for (int n3 = 0; n3 < n; ++n3)
                for (int m3 = 0; m3 < m; ++m3) {
                    nm[n3][m3] = false;
                }
            //Quân hậu
            int countq = sc.nextInt();
            int countq2 = countq;
            int[] nq = new int[countq];
            int[] mq = new int[countq];
            while (countq > 0) {
                --countq;
                nq[countq] = sc.nextInt();
                nq[countq] = nq[countq] - 1;
                mq[countq] = sc.nextInt();
                mq[countq] = mq[countq] - 1;
                nm[nq[countq]][mq[countq]] = true;
            }
            //quân mã
            int countk = sc.nextInt();
            int countk2 = countk;
            int[] nk = new int[countk];
            int[] mk = new int[countk];
            while (countk > 0) {
                --countk;
                nk[countk] = sc.nextInt();
                nk[countk] = nk[countk] - 1;
                mk[countk] = sc.nextInt();
                mk[countk] = mk[countk] - 1;
                nm[nk[countk]][mk[countk]] = true;
            }
            //quân tốt
            int countp = sc.nextInt();
            int[] np = new int[countp];
            int[] mp = new int[countp];
            while (countp > 0) {
                --countp;
                np[countp] = sc.nextInt();
                np[countp] = np[countp] - 1;
                mp[countp] = sc.nextInt();
                mp[countp] = mp[countp] - 1;
                nm[np[countp]][mp[countp]] = true;
            }
            //quân hậu
            countq = countq2;
            while (countq > 0) {
                --countq;
                for (int j = 1; ; ++j) {
                    if (nq[countq] + j < n && mq[countq] + j < m) {
                        if (!nm[nq[countq] + j][mq[countq] + j])
                            nm[nq[countq] + j][mq[countq] + j] = true;
                    } else break;
                }
                for (int j = 1; ; ++j) {
                    if (nq[countq] - j >= 0 && mq[countq] - j >= 0 && !nm[nq[countq] - j][mq[countq] - j]) {
                        nm[nq[countq] - j][mq[countq] - j] = true;
                    } else break;
                }
                for (int j = 1; ; ++j) {
                    if (nq[countq] - j >= 0 && mq[countq] + j < m && !nm[nq[countq] - j][mq[countq] + j]) {
                        nm[nq[countq] - j][mq[countq] + j] = true;
                    } else break;
                }
                for (int j = 1; ; ++j) {
                    if (nq[countq] + j < n && mq[countq] - j >= 0 && !nm[nq[countq] + j][mq[countq] - j]) {
                        nm[nq[countq] + j][mq[countq] - j] = true;
                    } else break;
                }
                for (int j = 1; ; ++j) {
                    if (nq[countq] + j < n && !nm[nq[countq] + j][mq[countq]]) {
                        nm[nq[countq] + j][mq[countq]] = true;
                    } else break;
                }
                for (int j = 1; ; ++j) {
                    if (nq[countq] - j >= 0 && !nm[nq[countq] - j][mq[countq]]) {
                        nm[nq[countq] - j][mq[countq]] = true;
                    } else break;
                }
                for (int j = 1; ; ++j) {
                    if (mq[countq] + j < m && !nm[nq[countq]][mq[countq] + j]) {
                        nm[nq[countq]][mq[countq] + j] = true;
                    } else break;
                }
                for (int j = 1; ; ++j) {
                    if (mq[countq] - j >= 0 && !nm[nq[countq]][mq[countq] - j]) {
                        nm[nq[countq]][mq[countq] - j] = true;
                    } else break;
                }
            }
            //Quân mã
            while (countk2 > 0) {
                --countk2;
                if (nk[countk] + 2 < n && mk[countk] + 1 < m)
                    nm[nk[countk] + 2][mk[countk] + 1] = true;
                if (nk[countk] + 2 < n && mk[countk] - 1 >= 0)
                    nm[nk[countk] + 2][mk[countk] - 1] = true;
                if (nk[countk] - 2 >= 0 && mk[countk] + 1 < m)
                    nm[nk[countk] - 2][mk[countk] + 1] = true;
                if (nk[countk] - 2 >= 0 && mk[countk] - 1 < m)
                    nm[nk[countk] - 2][mk[countk] - 1] = true;
                if (nk[countk] + 1 < n && mk[countk] + 2 < m)
                    nm[nk[countk] + 1][mk[countk] + 2] = true;
                if (nk[countk] + 1 < n && mk[countk] - 2 >= 0)
                    nm[nk[countk] + 1][mk[countk] - 2] = true;
                if (nk[countk] - 1 >= 0 && mk[countk] + 2 < m)
                    nm[nk[countk] - 1][mk[countk] + 2] = true;
                if (nk[countk] - 1 >= 0 && mk[countk] - 2 >= 0)
                    nm[nk[countk] - 1][mk[countk] - 2] = true;
            }
            Integer dem = 0;
            for (int n3 = 0; n3 < n; ++n3)
                for (int m3 = 0; m3 < m; ++m3) {
                    if (!nm[n3][m3]) {
                        ++dem;
                    }

                }
            ketqua.add( dem);
            dem2++;
            n = sc.nextInt();
            m = sc.nextInt();
        }
        for (int j3 = 0; j3 < dem2; ++j3)
            System.out.println("Board " + (j3 + 1) + " has " + ketqua.get(j3) + " safe squares.");
    }catch (NumberFormatException e){
    }
}