题目地址: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 */
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。