本题是简单的模拟,使用双层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;elsecout << ",";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;elsecout << ",";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;
}