#include #include #include using namespace std; int rows, cols; char board[1000][1000]; void trace(int r, int c, int dr, int dc) { while (1) { r += dr; c += dc; if (r < 0 || r >= rows || c < 0 || c >= cols || isalpha(board[r][c])) return; board[r][c] = '*'; } } void jump(int r, int c, int dr, int dc) { r += dr; c += dc; if (r < 0 || r >= rows || c < 0 || c >= cols || isalpha(board[r][c])) return; board[r][c] = '*'; } void queen(int r, int c) { trace(r, c, +1, +1); trace(r, c, +0, +1); trace(r, c, -1, +1); trace(r, c, -1, +0); trace(r, c, -1, -1); trace(r, c, +0, -1); trace(r, c, +1, -1); trace(r, c, +1, +0); } void knight(int r, int c) { jump(r, c, +2, +1); jump(r, c, -2, +1); jump(r, c, +1, +2); jump(r, c, -1, +2); jump(r, c, +2, -1); jump(r, c, -2, -1); jump(r, c, +1, -2); jump(r, c, -1, -2); } int main(void) { for (int casei = 1; ; ++casei) { cin >> rows >> cols; if (rows == 0 && cols == 0) break; for (int i = 0; i < 1000; ++i) for (int j = 0; j < 1000; ++j) board[i][j] = ' '; int n, r, c; cin >> n; while (n--) { cin >> r >> c; r -= 1; c -= 1; board[r][c] = 'q'; } cin >> n; while (n--) { cin >> r >> c; r -= 1; c -= 1; board[r][c] = 'k'; } cin >> n; while (n--) { cin >> r >> c; r -= 1; c -= 1; board[r][c] = 'p'; } for (r = 0; r < rows; ++r) { for (c = 0; c < cols; ++c) { if (board[r][c] == 'q') { queen(r,c); } else if (board[r][c] == 'k') { knight(r,c); } } } int count = 0; for (r = 0; r < rows; ++r) { for (c = 0; c < cols; ++c) { //cout << board[r][c]; if (board[r][c] == ' ') ++count; } //cout << endl; } cout << "Board " << casei << " has " << count << " safe squares." << endl; } return 0; }