题意:给出一个8 x 8的黑白相间的棋盘,棋盘上有黑子和白字,棋子类型有K、Q、R、B、N、P,白棋用大写表示,黑棋用小写表示,根据给出的棋盘,分别输出白棋、黑棋的位置。
分析:模拟
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef pair<char,int> pos;
const char piece[] = "KQRBNP";
char line[100];
map<char, vector<pos> >h;
bool blackcmp(pos a, pos b) {
if(a.se == b.se) {
return a.fi < b.fi;
}
return a.se > a.se;
}
bool whitecmp(pos a, pos b) {
if(a.se == b.se) {
return a.fi < b.fi;
}
return a.se < b.se;
}
int main() {
while(scanf("%s", line) != EOF) {
h.clear();
for(char i = 8; i > 0; i--) {
scanf("%s", line);
for(int k = 0, j = 'a' - 1; line[k] != '\0'; k++) {
if(isalpha(line[k])) {
h[line[k]].push_back(pos((char)j, i));
}
else if(line[k] == '|') {
j++;
}
}
scanf("%s", line);
}
for(int i = 0; piece[i] != '\0'; i++) {
char tmp1 = tolower(piece[i]), tmp2 = piece[i];
sort(h[tmp1].begin(), h[tmp1].end(), blackcmp);
sort(h[tmp2].begin(), h[tmp2].end(), whitecmp);
}
vector<pos>::iterator it;
printf("White: ");
for(int i = 0, f = 0; piece[i] != '\0'; i++) {
char tmp = piece[i];
if(!h[tmp].empty()) {
for(it = h[tmp].begin(); it != h[tmp].end(); ++it) {
if(f) { putchar(','); }
if(piece[i] != 'P') { putchar(piece[i]); }
printf("%c%d", it->fi, it->se);
f = 1;
}
}
}
puts("");
printf("Black: ");
for(int i = 0, f = 0; piece[i] != '\0'; i++) {
char tmp = tolower(piece[i]);
if(!h[tmp].empty()) {
for(it = h[tmp].begin(); it != h[tmp].end(); ++it) {
if(f) { putchar(','); }
if(piece[i] != 'P') { putchar(piece[i]); }
printf("%c%d", it->fi, it->se);
f = 1;
}
}
}
puts("");
}
return 0;
}