poj 2996 Help Me with the Game 模拟

国际象棋棋盘模拟
题意:
1、不论黑白,KQRBNP均是依次输出,强制大写,但不输出“P”,只输出其坐标
2、白棋:行的数字越小则优先输出,同行则按列的顺序(a~h)
3、黑棋:行的数字越大则优先输出,同行则按列的顺序(a~h)
4、棋子可能不齐全,不存在的棋子不输出,用标记解决
5、注意逗号的输出格式

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define N 300
using namespace std;
struct by
{
    char c;
    int num;
    int m0[N];
    int m1[N];
} b[N];
struct bby
{
    int m0,m1;
} bm[N];
bool cmpw(struct bby q,struct bby w)
{
    if(q.m0==w.m0)
        return q.m1<w.m1;
    return q.m0<w.m0;
}
bool cmpb(struct bby q,struct bby w)
{
    if(q.m0==w.m0)
        return q.m1<w.m1;
    return q.m0>w.m0;
}
int main()
{
    char map[N][N];
    memset(b,0,sizeof(b));
    int i,k=17,j;
    for(i=0; i<17; i++)
        scanf("%s",map[i]);
    b[0].c='K',b[1].c='Q',b[2].c='R',b[3].c='B',b[4].c='N';
    b[10].c='K',b[11].c='Q',b[12].c='R',b[13].c='B',b[14].c='N';
    for(i=1; i<k; i+=2) {
        for(j=0; map[i][j]; j++) {
            switch(map[i][j]) {
            case 'K':
                b[0].m0[b[0].num]=k-i,b[0].m1[b[0].num]=j/4,b[0].num++;
                break;
            case 'Q':
                b[1].m0[b[1].num]=k-i,b[1].m1[b[1].num]=j/4,b[1].num++;
                break;
            case 'R':
                b[2].m0[b[2].num]=k-i,b[2].m1[b[2].num]=j/4,b[2].num++;
                break;
            case 'B':
                b[3].m0[b[3].num]=k-i,b[3].m1[b[3].num]=j/4,b[3].num++;
                break;
            case 'N':
                b[4].m0[b[4].num]=k-i,b[4].m1[b[4].num]=j/4,b[4].num++;
                break;
            case 'P':
                b[5].m0[b[5].num]=k-i,b[5].m1[b[5].num]=j/4,b[5].num++;
                break;
            case 'k':
                b[10].m0[b[10].num]=k-i,b[10].m1[b[10].num]=j/4,b[10].num++;
                break;
            case 'q':
                b[11].m0[b[11].num]=k-i,b[11].m1[b[11].num]=j/4,b[11].num++;
                break;
            case 'r':
                b[12].m0[b[12].num]=k-i,b[12].m1[b[12].num]=j/4,b[12].num++;
                break;
            case 'b':
                b[13].m0[b[13].num]=k-i,b[13].m1[b[13].num]=j/4,b[13].num++;
                break;
            case 'n':
                b[14].m0[b[14].num]=k-i,b[14].m1[b[14].num]=j/4,b[14].num++;
                break;
            case 'p':
                b[15].m0[b[15].num]=k-i,b[15].m1[b[15].num]=j/4,b[15].num++;
                break;
            }
        }
    }
    cout<<"White: ";
    int flag=0;
    for(i=0; i<=5; i++) {
        for(j=0; j<b[i].num; j++)/*由于弱弱的我对于结构体的排序不太清楚,就只好另存一个数组中啦*/
        {
            bm[j].m0=b[i].m0[j]/2;
            bm[j].m1=b[i].m1[j];
        }
        sort(bm,bm+b[i].num,cmpw);
        for(j=0; j<b[i].num; j++) {
            if(flag)/*此处的逗号输出想了很久*/
                printf(",");
            flag++;
            if(i!=5)
                cout<<b[i].c;
            printf("%c",bm[j].m1+'a');
            printf("%d",bm[j].m0);
        }
    }
    cout<<endl;
    cout<<"Black: ";
    flag=0;
    for(i=10; i<=15; i++) {
        for(j=0; j<b[i].num; j++)
        {
            bm[j].m0=b[i].m0[j]/2;
            bm[j].m1=b[i].m1[j];
        }
        sort(bm,bm+b[i].num,cmpb);
        for(j=0; j<b[i].num; j++) {
            if(flag)
                printf(",");
            flag++;
            if(i!=15)
                cout<<b[i].c;
            printf("%c",bm[j].m1+'a');
            printf("%d",bm[j].m0);
        }
    }
    cout<<endl;
    return 0;
}

 

posted @ 2016-04-05 19:07  byonlym  阅读(134)  评论(0编辑  收藏  举报