题目地址:http://poj.org/problem?id=2996
1 /*
2 题意:给出白方和黑方的棋子和对应的坐标,输出该副棋盘的样子
3 模拟题 + 结构体排序:无算法,switch区分读入的字符,按照黑白的排序规则排序,再输出
4 注意:(转载)1,棋盘中大写字母表示的是白方棋子,小写是黑方。
5 2,注意棋盘的行数是从最下面开始计数的。和数组的下标相反。也就是说数组行数为8的棋盘行 数为1(数组从1开始)。
6 3,最容易忽略也最重要的是:白旗和黑棋在输出的时候其实排序规则是不一样的(但是棋子的类型都要按照KQRBNP顺序)。
7 主要是行列的优先问题:
8 白棋先按行数(棋盘的行编号)升序排,然后按照列升序排。解决办法:按行升序扫描输出。
9 黑棋先按行数(棋盘的编号)降序排,然后按照列升序排。解决办法:按行降序扫描输出。
10 输出的时候主要是要注意一下循环扫描的顺序就行了。
11 详细解释:http://poj.org/showmessage?message_id=346814
12 */
13 #include <cstdio>
14 #include <iostream>
15 #include <algorithm>
16 #include <cstring>
17 #include <cmath>
18 #include <string>
19 #include <map>
20 #include <queue>
21 #include <vector>
22 using namespace std;
23
24 const int MAXN = 1e6 + 10;
25 const int INF = 0x3f3f3f3f;
26 struct NODEb
27 {
28 char ch, col;
29 int pow, row;
30 }nodeb[1000];
31 struct NODEw
32 {
33 char ch, col;
34 int pow, row;
35 }nodew[1000];
36 int a[50][50];
37 string s[16];
38 string ss[16];
39
40 bool cmpw(NODEw x, NODEw y)
41 {
42 if (x.pow == y.pow)
43 {
44 if (x.row == y.row) return x.col < y.col;
45 else return x.row < y.row;
46 }
47 return x.pow < y.pow;
48 }
49
50 bool cmpb(NODEb x, NODEb y)
51 {
52 if (x.pow == y.pow)
53 {
54 if (x.row == y.row) return x.col < y.col;
55 else return x.row > y.row;
56 }
57 return x.pow < y.pow;
58 }
59
60 void work(void)
61 {
62 for (int i=1; i<=8; ++i)
63 {
64 int k = 0;
65 for (int j=2; j<33; j+=4)
66 {
67 ++k;
68 switch (s[i][j])
69 {
70 case 'K': a[i][k] = 1; break;
71 case 'Q': a[i][k] = 2; break;
72 case 'R': a[i][k] = 3; break;
73 case 'B': a[i][k] = 4; break;
74 case 'N': a[i][k] = 5; break;
75 case 'P': a[i][k] = 6; break;
76 case 'k': a[i][k] = -1; break;
77 case 'q': a[i][k] = -2; break;
78 case 'r': a[i][k] = -3; break;
79 case 'b': a[i][k] = -4; break;
80 case 'n': a[i][k] = -5; break;
81 case 'p': a[i][k] = -6; break;
82 case ':': a[i][k] = 0; break;
83 case '.': a[i][k] = 0; break;
84 default: break;
85 }
86 }
87 }
88 int tb = 0, tw = 0;
89 for (int i=1; i<=8; ++i)
90 {
91 for (int j=1; j<=8; ++j)
92 {
93 if (a[i][j] > 0)
94 {
95 nodew[++tw].pow = a[i][j];
96 nodew[tw].row = 9 - i; nodew[tw].col = 'a' + j - 1;
97 switch (a[i][j])
98 {
99 case 1: nodew[tw].ch = 'K'; break;
100 case 2: nodew[tw].ch = 'Q'; break;
101 case 3: nodew[tw].ch = 'R'; break;
102 case 4: nodew[tw].ch = 'B'; break;
103 case 5: nodew[tw].ch = 'N'; break;
104 default: break;
105 }
106 }
107 if (a[i][j] < 0)
108 {
109 nodeb[++tb].pow = -a[i][j];
110 nodeb[tb].row = 9 - i; nodeb[tb].col = 'a' + j - 1;
111 switch (a[i][j])
112 {
113 case -1: nodeb[tb].ch = 'K'; break;
114 case -2: nodeb[tb].ch = 'Q'; break;
115 case -3: nodeb[tb].ch = 'R'; break;
116 case -4: nodeb[tb].ch = 'B'; break;
117 case -5: nodeb[tb].ch = 'N'; break;
118 default: break;
119 }
120 }
121 }
122 }
123
124 sort (nodew+1, nodew+1+tw, cmpw);
125 sort (nodeb+1, nodeb+1+tb, cmpb);
126
127 cout << "White: ";
128 for (int i=1; i<=tw; ++i)
129 {
130 if (nodew[i].pow != 6)
131 cout << nodew[i].ch;
132 cout << nodew[i].col << nodew[i].row;
133 if (i != tw) cout << ',';
134 }
135 cout << endl;
136 cout << "Black: ";
137 for (int i=1; i<=tb; ++i)
138 {
139 if (nodeb[i].pow != 6)
140 cout << nodeb[i].ch;
141 cout << nodeb[i].col << nodeb[i].row;
142 if (i != tb) cout << ',';
143 }
144 cout << endl;
145 }
146
147 int main(void) //POJ 2996 Help Me with the Game
148 {
149 freopen ("I.in", "r", stdin);
150
151 for (int i=1; i<=8; ++i)
152 {
153 cin >> ss[i]; cin >> s[i];
154 }
155 cin >> ss[9];
156
157 work ();
158
159 return 0;
160 }
161
162 /*
163 White: Ke1,Qd1,Ra1,Rh1,Bc1,Bf1,Nb1,a2,c2,d2,f2,g2,h2,a3,e4
164 Black: Ke8,Qd8,Ra8,Rh8,Bc8,Ng8,Nc6,a7,b7,c7,d7,e7,f7,h7,h6
165 */