一道比较烦的模拟题。大概题意如下:
注意事项:
1、输入的时候,行号是倒过来的,及输入的第一行,在输出的时候,行号为8
2、输出顺序为K、Q、R、B、N、P,输出结构为旗子的种类、旗子的列、旗子的行,其中如果旗子的种类为P,则只输出旗子的列和行
3、相同种类旗子,白棋按行号从小到大排列,黑棋从大到小排列。
//Memory Time
//216K 0MS
#include <stdio.h>
#include <iostream>
using namespace std;
/*
1、输出先列后行
2、行号是从下往上计数的,最上面的行是8
4、白 行号为从小到大 黑相反
*/
struct chess
{
char name;
char row;
char col;
};
void printChessInfo(chess* array, int number);
chess white[64];
chess black[64];
// King("K"), Queens ("Q"), Rooks ("R"), Bishops ("B"), Knights ("N"), and pawns.
// a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
const char map[26] = {9,3,9,9,9,9,9,9,9,9,0,9,9,4,9,5,1,2,9,9,9,9,9,9,9,9};
const char unmap[6] = {'K','Q','R','B','N','P'};
#define COLUMN 33
char chessMap[COLUMN][17];
char s[COLUMN];
int main()
{
int whitePt = 0;
int blackPt = 0;
//输入
for(int i = 8; i > 0; i--) //i row
{
cin >> s;
cin >> s;
for(int j = 0; j < COLUMN; j++) //j col
{
int colPt = j * 4;
if(!(s[colPt + 2] == '.' || s[colPt + 2] == ':'))
{
if(s[colPt + 2] - 'A' >= 0 && s[colPt + 2] - 'A' < 26)
{
white[whitePt].name = map[s[colPt+2] - 'A'];
white[whitePt].row = i;
white[whitePt].col = j;
whitePt++;
}else if(s[colPt+2] - 'a' >= 0 && s[colPt+2] - 'a' < 26)
{
black[blackPt].name = map[s[colPt+2] - 'a'];
black[blackPt].row = i;
black[blackPt].col = j;
blackPt++;
}
}
}
}
cin >> s;
//输出 White
cout << "White: ";
for(int i = 0; i < whitePt; i++) //注意一定要是稳定排序,这里用的冒泡
{
for(int j = 1; j < whitePt - i; j++)
{
if(white[j].row < white[j-1].row)
{
chess temp = white[j];
white[j] = white[j-1];
white[j-1] = temp;
}
}
}
printChessInfo(white, whitePt);
//输出 Black
cout << "Black: ";
printChessInfo(black, blackPt);
return 0;
}
void printChessInfo(chess* array, int number)
{
for(int i = 0; i < number; i++) //注意一定要是稳定排序,这里用的冒泡
{
for(int j = 1; j < number - i; j++)
{
if(array[j].name < array[j-1].name)
{
chess temp = array[j];
array[j] = array[j-1];
array[j-1] = temp;
}
}
}
for(int i = 0; i < number-1; i++) //注意一定要是稳定排序,这里用的冒泡
{
if(array[i].name < 5)
cout << unmap[array[i].name];
cout<< (char)(array[i].col + 'a') << (char)(array[i].row + '0') << ',';
}
if(array[number-1].name < 5)
cout << unmap[array[number-1].name];
cout<< (char)(array[number-1].col + 'a') << (char)(array[number-1].row + '0') << endl;
}