#include
#include
char board[8][9];
bool flag[8][8];
void resetBoard(){ //Fungsi untuk reset board tiap case baru
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
flag[i][j] = false;
}
}
}
bool checkEnemy(int x, int y){ //Fungsi cek itu musuh/bukan
if(x>7 || x<0 || y>7 || y<0){ //Cek apakah keluar batas
return false;
}
if(islower(board[x][y])){ //Kalo huruf kecil = musuh
flag[x][y] = true; //Tandain boardnya yg ada musuh yg bisa kita serang
return true;
}
return false; //return false kalo dia gk ada apa"
}
void knightMoves(int x, int y){ //Fungsi untuk kuda, ada 8 titik hitung manual jadinya langsung panggil func 8x
//bawah
checkEnemy(x+1, y-2);
checkEnemy(x+1, y+2);
checkEnemy(x+2, y-1);
checkEnemy(x+2, y+1);
//atas
checkEnemy(x-1, y-2);
checkEnemy(x-1, y+2);
checkEnemy(x-2, y-1);
checkEnemy(x-2, y+1);
}
void kingMoves(int x, int y){ //Fungsi untuk raja
for(int i=x-1;i<=x+1;i++){ //Bentuk array 2d 3x3 dengan titik tengah posisi raja
for(int j=y-1;j<=y+1;j++){
checkEnemy(i, j);
}
}
}
void bishopMoves(int x, int y){
for(int i=x-1, j=y-1;i>=0 && j>=0;i--,j--){ //Diagonal kiri atas
if(isupper(board[i][j])){ //Break kalo ketemu temen, karna kehalang langsung gk bisa lanjut
break;
}
if(checkEnemy(i, j)){
break;
}
}
for(int i=x-1, j=y+1;i>=0 && j<8;i--,j++){ //Diagonal kanan atas
if(isupper(board[i][j])){
break;
}
if(checkEnemy(i, j)){
break;
}
}
for(int i=x+1, j=y-1;i<8 && j>=0;i++,j--){ //Diagonal kiri bawah
if(isupper(board[i][j])){
break;
}
if(checkEnemy(i, j)){
break;
}
}
for(int i=x+1, j=y+1;i<8 && j<8;i++,j++){ //Diagonal kanan bawah
if(isupper(board[i][j])){
break;
}
if(checkEnemy(i, j)){
break;
}
}
}
void pawnMoves(int x, int y){ //Fungsi untuk pion
checkEnemy(x-1, y-1); //Cek diagonal kiri atas
checkEnemy(x-1, y+1); //Cek diagonal kanan atas
}
void rookMoves(int x, int y){
for(int i=y-1;i>=0;i--){ //Geser kiri ampe mentok
if(isupper(board[x][i])){
break;
}
if(checkEnemy(x, i)){
break;
}
}
for(int i=y+1;i<8;i++){ //Geser kanan ampe mentok
if(isupper(board[x][i])){
break;
}
if(checkEnemy(x, i)){
break;
}
}
for(int i=x-1;i>=0;i--){ //Geser atas ampe mentok
if(isupper(board[i][y])){
break;
}
if(checkEnemy(i, y)){
break;
}
}
for(int i=x+1;i<8;i++){ //Geser bawah mentok
if(isupper(board[i][y])){
break;
}
if(checkEnemy(i, y)){
break;
}
}
}
void findEnemy(int x, int y, char k){
switch(k){
case 'P':
pawnMoves(x, y);
break;
case 'R':
rookMoves(x, y);
break;
case 'B':
bishopMoves(x, y);
break;
case 'N':
knightMoves(x, y);
break;
case 'Q': //Panggil 3 function karena movesnya si ratu terdiri atas move yg bisa dilakukan 3 karakter
rookMoves(x, y);
bishopMoves(x, y);
break;
case 'K':
kingMoves(x, y);
break;
}
}
int main(){
int tc;
scanf("%d", &tc);
for(int i=1;i<=tc;i++){
bool check;
resetBoard();
for(int j=0;j<8;j++){ //Isi array 2d dengan boardnya
getchar();
scanf("%[^\n]", board[j]);
}
for(int j=0;j<8;j++){ //Loop array 2d buat nyari musuh
for(int k=0;k<8;k++){
if(isupper(board[j][k])){ //Kalo ketemu huruf besar berarti punya kita, kita cek musuh apa aja yg bisa dimakan
findEnemy(j, k, board[j][k]); //Sama karakter dititik itu
}
}
}
printf("Case #%d:\n", i);
for(int j=0;j<8;j++){ // Loop untuk print keluar titik yang bisa diserang
for(int k=0;k<8;k++){
if(flag[j][k]){
check = true; //check untuk nandain kalo ada yg bisa diserang, kalo ampe ujung gk ada berarti false, print -1
printf("%c %d\n", 65+k, 8-j);
}
}
}
if(!check){
printf("-1\n");
}
}
return 0;
}