本题是简单的模拟,使用双层vector嵌套存储棋子的位置和种类,然后分别对每个vector进行排序
注意:排序方法为sort(piece[i].begin(), piece[i].end(), cmpWhite);
当然,cmpWhite是比较函数,可以不加比较函数,只用用前两个参数。
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include<algorithm>
using namespace std;
const int maxn = 9;
int getid[150];
struct Piece
{
int x, y, d;
Piece()
{
}
Piece(int xx, int yy, char dd) :
x(xx), y(yy), d(dd)
{
}
};
vector<vector<Piece> > piece(12);
void init()
{
string st;
memset(getid, -1, sizeof(getid));
getid[int('K')] = 0;
getid[int('Q')] = 1;
getid[int('R')] = 2;
getid[int('B')] = 3;
getid[int('N')] = 4;
getid[int('P')] = 5;
getid[int('k')] = 6;
getid[int('q')] = 7;
getid[int('r')] = 8;
getid[int('b')] = 9;
getid[int('n')] = 10;
getid[int('p')] = 11;
for (int i = 1; i < maxn; i++)
{
getline(cin, st);
for (int j = 1; j < maxn; j++)
{
char ch;
getchar();
getchar();
cin >> ch;
getchar();
if (getid[int(ch)] != -1)
piece[getid[int(ch)]].push_back(Piece(9 - i, j, ch));
}
getline(cin, st);
}
}
bool cmpWhite(const Piece &a, const Piece &b)
{
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
bool cmpBlack(const Piece &a, const Piece &b)
{
if (a.x == b.x)
return a.y < b.y;
return a.x > b.x;
}
void sortout()
{
for (int i = 0; i < 6; i++)
sort(piece[i].begin(), piece[i].end(), cmpWhite);
for (int i = 6; i < 12; i++)
sort(piece[i].begin(), piece[i].end(), cmpBlack);
}
void output()
{
bool first = true;
cout << "White: ";
for (int i = 0; i < 6; i++)
{
for (unsigned int j = 0; j < piece[i].size(); j++)
{
if (first)
first = false;
else
cout << ",";
if (piece[i][j].d != 'P')
cout << char(piece[i][j].d);
cout << char(piece[i][j].y + 'a' - 1) << piece[i][j].x;
}
}
cout << endl;
first = true;
cout << "Black: ";
for (int i = 6; i < 12; i++)
{
for (unsigned int j = 0; j < piece[i].size(); j++)
{
if (first)
first = false;
else
cout << ",";
if (piece[i][j].d != 'p')
cout << char(piece[i][j].d - 'a' + 'A');
cout << char(piece[i][j].y + 'a' - 1) << piece[i][j].x;
}
}
}
int main()
{
//freopen("D:\\t.txt", "r", stdin);
init();
sortout();
output();
return 0;
}