题目大意:模拟出一个国际象棋的棋盘,给出你一个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;
}