模拟 POJ 2996 Help Me with the Game

题目地址: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 */
编译人生,运行世界!
原文地址:https://www.cnblogs.com/Running-Time/p/4372527.html