模拟 POJ 2996 Help Me with the Game
2015-03-27 17:56
387 查看
题目地址:http://poj.org/problem?id=2996
/* 题意:给出白方和黑方的棋子和对应的坐标,输出该副棋盘的样子 模拟题 + 结构体排序:无算法,switch区分读入的字符,按照黑白的排序规则排序,再输出 注意:(转载)1,棋盘中大写字母表示的是白方棋子,小写是黑方。 2,注意棋盘的行数是从最下面开始计数的。和数组的下标相反。也就是说数组行数为8的棋盘行 数为1(数组从1开始)。 3,最容易忽略也最重要的是:白旗和黑棋在输出的时候其实排序规则是不一样的(但是棋子的类型都要按照KQRBNP顺序)。 主要是行列的优先问题: 白棋先按行数(棋盘的行编号)升序排,然后按照列升序排。解决办法:按行升序扫描输出。 黑棋先按行数(棋盘的编号)降序排,然后按照列升序排。解决办法:按行降序扫描输出。 输出的时候主要是要注意一下循环扫描的顺序就行了。 详细解释:http://poj.org/showmessage?message_id=346814 */ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <string> #include <map> #include <queue> #include <vector> using namespace std; const int MAXN = 1e6 + 10; const int INF = 0x3f3f3f3f; struct NODEb { char ch, col; int pow, row; }nodeb[1000]; struct NODEw { char ch, col; int pow, row; }nodew[1000]; int a[50][50]; string s[16]; string ss[16]; bool cmpw(NODEw x, NODEw y) { if (x.pow == y.pow) { if (x.row == y.row) return x.col < y.col; else return x.row < y.row; } return x.pow < y.pow; } bool cmpb(NODEb x, NODEb y) { if (x.pow == y.pow) { if (x.row == y.row) return x.col < y.col; else return x.row > y.row; } return x.pow < y.pow; } void work(void) { for (int i=1; i<=8; ++i) { int k = 0; for (int j=2; j<33; j+=4) { ++k; switch (s[i][j]) { case 'K': a[i][k] = 1; break; case 'Q': a[i][k] = 2; break; case 'R': a[i][k] = 3; break; case 'B': a[i][k] = 4; break; case 'N': a[i][k] = 5; break; case 'P': a[i][k] = 6; break; case 'k': a[i][k] = -1; break; case 'q': a[i][k] = -2; break; case 'r': a[i][k] = -3; break; case 'b': a[i][k] = -4; break; case 'n': a[i][k] = -5; break; case 'p': a[i][k] = -6; break; case ':': a[i][k] = 0; break; case '.': a[i][k] = 0; break; default: break; } } } int tb = 0, tw = 0; for (int i=1; i<=8; ++i) { for (int j=1; j<=8; ++j) { if (a[i][j] > 0) { nodew[++tw].pow = a[i][j]; nodew[tw].row = 9 - i; nodew[tw].col = 'a' + j - 1; switch (a[i][j]) { case 1: nodew[tw].ch = 'K'; break; case 2: nodew[tw].ch = 'Q'; break; case 3: nodew[tw].ch = 'R'; break; case 4: nodew[tw].ch = 'B'; break; case 5: nodew[tw].ch = 'N'; break; default: break; } } if (a[i][j] < 0) { nodeb[++tb].pow = -a[i][j]; nodeb[tb].row = 9 - i; nodeb[tb].col = 'a' + j - 1; switch (a[i][j]) { case -1: nodeb[tb].ch = 'K'; break; case -2: nodeb[tb].ch = 'Q'; break; case -3: nodeb[tb].ch = 'R'; break; case -4: nodeb[tb].ch = 'B'; break; case -5: nodeb[tb].ch = 'N'; break; default: break; } } } } sort (nodew+1, nodew+1+tw, cmpw); sort (nodeb+1, nodeb+1+tb, cmpb); cout << "White: "; for (int i=1; i<=tw; ++i) { if (nodew[i].pow != 6) cout << nodew[i].ch; cout << nodew[i].col << nodew[i].row; if (i != tw) cout << ','; } cout << endl; cout << "Black: "; for (int i=1; i<=tb; ++i) { if (nodeb[i].pow != 6) cout << nodeb[i].ch; cout << nodeb[i].col << nodeb[i].row; if (i != tb) cout << ','; } cout << endl; } int main(void) //POJ 2996 Help Me with the Game { freopen ("I.in", "r", stdin); for (int i=1; i<=8; ++i) { cin >> ss[i]; cin >> s[i]; } cin >> ss[9]; work (); return 0; } /* White: Ke1,Qd1,Ra1,Rh1,Bc1,Bf1,Nb1,a2,c2,d2,f2,g2,h2,a3,e4 Black: Ke8,Qd8,Ra8,Rh8,Bc8,Ng8,Nc6,a7,b7,c7,d7,e7,f7,h7,h6 */
相关文章推荐
- poj 2996 Help Me with the Game 模拟
- POJ-2996 Help Me with the Game 模拟
- poj_2996 Help Me with the Game(模拟)
- POJ训练计划2996_Help Me with the Game(模拟)
- POJ 2996 Help Me with the Game 国际象棋,模拟
- POJ 2996 Help Me with the Game 大模拟
- POJ 2996 Help Me with the Game(水模拟)
- POJ 2996 Help Me with the Game (模拟)
- POJ 2996 Help Me with the Game(模拟)
- poj-2996-2993-Help Me with the Game-模拟法
- POJ 2996 Help Me with the Game(模拟)
- POJ 2996-Help Me with the Game(模拟-描述棋盘中KQRBNP的位置)
- poj 2996 Help Me with the Game 模拟
- poj 2996 Help Me with the Game(模拟)
- POJ2996 Help Me with the Game(模拟)
- 快速切题 poj 2996 Help Me with the Game 棋盘 模拟 暴力 难度:0
- POJ - 2996 - Help Me with the Game - [模拟中的自定义排序技巧]
- POJ 2996 Help Me with the Game(模拟)
- poj 2996 Help Me with the Game 模拟
- POJ 2996-Help Me with the Game(模拟)