该题为一道纯模拟题,不需要任何算法。在选择棋子的时候定义好排序规则,将其一次排序出来。
代码如下:
#include <cstring> #include <cstdlib> #include <cstdio> #include <cctype> #include <algorithm> using namespace std; int pos = 0; int hash[255]; struct Node { char kind; int x, y; bool operator < (Node t) const { if (hash[kind] != hash[t.kind]) { return hash[kind] > hash[t.kind]; } else if (isupper(kind)){ if (y != t.y) { return y < t.y; } else { return x < t.x; } } else { if (y != t.y) { return y > t.y; } else { return x < t.x; } } } }e[100]; char s[100]; void pre() { hash['K'] = 100, hash['Q'] = 99, hash['R'] = 98; hash['B'] = 97, hash['N'] = 96, hash['P'] = 95; hash['k'] = 94, hash['q'] = 93, hash['r'] = 92; hash['b'] = 91, hash['n'] = 90, hash['p'] = 89; } void deal(int y) { int len = strlen(s); for (int i = 0; i < len; ++i) { if (isalpha(s[i])) { ++pos; e[pos].y = y; e[pos].x = ((i-2)>>2)+1; e[pos].kind = s[i]; } } } void print() { int i; printf("White: "); for (i = 1; i <= pos && isupper(e[i].kind); ++i) { if (i == 1) { if (e[i].kind != 'P') { printf("%c%c%d", e[i].kind, e[i].x-1+'a', e[i].y); } else { printf("%c%d", e[i].x-1+'a', e[i].y); } } else { if (e[i].kind != 'P') { printf(",%c%c%d", e[i].kind, e[i].x-1+'a', e[i].y); } else { printf(",%c%d", e[i].x-1+'a', e[i].y); } } } printf("\nBlack: "); for (int j = i; j <= pos; ++j) { if (j == i) { if (e[j].kind != 'p') { printf("%c%c%d", e[j].kind-32, e[j].x-1+'a', e[j].y); } else { printf("%c%d", e[j].x-1+'a', e[j].y); } } else { if (e[j].kind != 'p') { printf(",%c%c%d", e[j].kind-32, e[j].x-1+'a', e[j].y); } else { printf(",%c%d", e[j].x-1+'a', e[j].y); } } } puts(""); } int main() { pre(); for (int i = 1; i <= 17; ++i) { gets(s); if ((i & 1) == 0) { // 说明该行为有效行 deal(9-(i>>1)); } } sort(e+1, e+1+pos); print(); // system("pause"); return 0; }