模拟 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 */

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号