POJ2996 Help Me with the Game 模拟题

题目大意:模拟出一个国际象棋的棋盘,给出你一个8×8的棋盘(行坐标由左到右为a到h,列坐标由上到下为8到1),和棋盘上的棋子,棋子有黑白两方,棋子有K,Q,R,B,N,和P 6种(但不一定全都有),让你分别找出棋盘上的黑白棋子的种类和坐标。


分析:模拟题,叙述很复杂,题其实很简单,就是个输入输出之间的转换。因为棋盘上每一点其实是有3个点构成的,为了方便找坐标,这里我用0到32分别表示每一列,用1到17表示行,这样做的好处就是,对于某一棋子的列坐标,我们只需拿棋盘上该点的列坐标c/4+' a '就行了,这样就得到了该棋子在a到h范围内的列坐标;对于行坐标,由于棋盘上行坐标是由下到上的,所以需要拿该点的行坐标r先除以2,这样就得到了由上到下排列时的行坐标了,再拿9减去这个数就得到了棋子真正的行坐标了。遍历棋子时用switch语句,能更方便的同时筛选出这6个点。另外输出的时候要注意排序,这6个棋子的输出顺序题中已给出,行列的优先就要自己由样例找了:对于白色棋子,行和列都按由小到大的顺序输出;但对于黑色棋子,行按由大到小的顺醋输出,列按由小到大的顺序输出。


实现代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
char map[40][20];
typedef struct node
{
    int x,y,p;
    char ch;
}piece;
piece up[100];
piece lo[100];
int cmp1(const piece &a,const piece &b)
{
    if(a.p==b.p&&a.y==b.y) return a.x<b.x;
    else if(a.p==b.p) return a.y<b.y;
    else return a.p<b.p;
}
int cmp2(const piece &a,const piece &b)
{
    if(a.p==b.p&&a.y==b.y) return a.x<b.x;
    else if(a.p==b.p) return a.y>b.y;
    else return a.p<b.p;
}
void output()
{
    int i,j;
    int cnt1=0,cnt2=0;
    for(j=1;j<=17;j++)
      for(i=0;i<33;i++)
      {
          switch(map[i][j])
          {
              case 'K':up[cnt1].p=1;
                       up[cnt1].x=i/4+'a';
                       up[cnt1].y=9-j/2;
                       up[cnt1].ch='K';
                       cnt1++;
                       break;
              case 'Q':up[cnt1].p=2;
                       up[cnt1].x=i/4+'a';
                       up[cnt1].y=9-j/2;
                       up[cnt1].ch='Q';
                       cnt1++;
                       break;
              case 'R':up[cnt1].p=3;
                       up[cnt1].x=i/4+'a';
                       up[cnt1].y=9-j/2;
                       up[cnt1].ch='R';
                       cnt1++;
                       break;
              case 'B':up[cnt1].p=4;
                       up[cnt1].x=i/4+'a';
                       up[cnt1].y=9-j/2;
                       up[cnt1].ch='B';
                       cnt1++;
                       break;
              case 'N':up[cnt1].p=5;
                       up[cnt1].x=i/4+'a';
                       up[cnt1].y=9-j/2;
                       up[cnt1].ch='N';
                       cnt1++;
                       break;
              case 'P':up[cnt1].p=6;
                       up[cnt1].x=i/4+'a';
                       up[cnt1].y=9-j/2;
                       up[cnt1].ch='P';
                       cnt1++;
                       break;
          }
          switch(map[i][j])
          {
              case 'k':lo[cnt2].p=1;
                       lo[cnt2].x=i/4+'a';
                       lo[cnt2].y=9-j/2;
                       lo[cnt2].ch='K';
                       cnt2++;
                       break;
              case 'q':lo[cnt2].p=2;
                       lo[cnt2].x=i/4+'a';
                       lo[cnt2].y=9-j/2;
                       lo[cnt2].ch='Q';
                       cnt2++;
                       break;
              case 'r':lo[cnt2].p=3;
                       lo[cnt2].x=i/4+'a';
                       lo[cnt2].y=9-j/2;
                       lo[cnt2].ch='R';
                       cnt2++;
                       break;
              case 'b':lo[cnt2].p=4;
                       lo[cnt2].x=i/4+'a';
                       lo[cnt2].y=9-j/2;
                       lo[cnt2].ch='B';
                       cnt2++;
                       break;
              case 'n':lo[cnt2].p=5;
                       lo[cnt2].x=i/4+'a';
                       lo[cnt2].y=9-j/2;
                       lo[cnt2].ch='N';
                       cnt2++;
                       break;
              case 'p':lo[cnt2].p=6;
                       lo[cnt2].x=i/4+'a';
                       lo[cnt2].y=9-j/2;
                       lo[cnt2].ch='P';
                       cnt2++;
                       break;
          }
      }
    cnt1-=1;
    cnt2-=1;
    sort(up,up+cnt1,cmp1);
    sort(lo,lo+cnt2,cmp2);
    printf("White: ");
    for(i=0;i<cnt1;i++)
    {
        if(i==cnt1-1)
        {
            if(up[i].ch=='P') printf("%c%d\n",up[i].x,up[i].y);
            else printf("%c%c%d\n",up[i].ch,up[i].x,up[i].y);
        }
        else
        {
            if(up[i].ch=='P') printf("%c%d,",up[i].x,up[i].y);
            else printf("%c%c%d,",up[i].ch,up[i].x,up[i].y);
        }
    }
    printf("Black: ");
    for(i=0;i<cnt2;i++)
    {
        if(i==cnt2-1)
        {
            if(lo[i].ch=='P') printf("%c%d\n",lo[i].x,lo[i].y);
            else printf("%c%c%d\n",lo[i].ch,lo[i].x,lo[i].y);
        }
        else
        {
            if(up[i].ch=='P') printf("%c%d,",lo[i].x,lo[i].y);
            else printf("%c%c%d,",lo[i].ch,lo[i].x,lo[i].y);
        }
    }
}
int main()
{
    int i,j;
    for(j=1;j<=17;j++)
      for(i=0;i<33;i++)
        cin>>map[i][j];
    output();
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值