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