您的位置:首页 > 其它

模拟 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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: