将一个棋盘翻译为文字表达。如下:
大写字母表示白方,小写表示黑方。输出时按照KQRBNP的顺序;棋盘格子编号的表示:从下往上是1~8,从左往右是a~h。
遇到相同棋子,白方表示时按从下往上从左往右的顺序,黑方按从上往下从左往右的顺序。
输出格式:
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
直接模拟。
分行读入棋盘,分析该行字母,将对应坐标记录。此处忽略黑白相同棋子从上往下和从下往上的区别,只需满足从上往下从左往右。
输出时黑子按存储的顺序输出即可,白子输出相同棋子时判断,若有相同棋子则先输出行数大的。
具体实现见代码。
Problem Status: AC。时间0ms,内存388k
——————————————————————分割线——————————————————————
注意棋子是有规律的,最多16个,但可以不全出现。KQ各一个,RBN最多两个,P8个。
#includevoid outputb(int a[16][2]) { int i; if (a[0][0]) printf("K%c%d",'a'+a[0][1]-1,9-a[0][0]); if (a[1][0]) printf(",Q%c%d",'a'+a[1][1]-1,9-a[1][0]); if (a[2][0]) printf(",R%c%d",'a'+a[2][1]-1,9-a[2][0]); if (a[3][0]) printf(",R%c%d",'a'+a[3][1]-1,9-a[3][0]); if (a[4][0]) printf(",B%c%d",'a'+a[4][1]-1,9-a[4][0]); if (a[5][0]) printf(",B%c%d",'a'+a[5][1]-1,9-a[5][0]); if (a[6][0]) printf(",N%c%d",'a'+a[6][1]-1,9-a[6][0]); if (a[7][0]) printf(",N%c%d",'a'+a[7][1]-1,9-a[7][0]); for(i=8;i<16;i++) if (a[i][0]) printf(",%c%d",'a'+a[i][1]-1,9-a[i][0]); } void outputw(int a[16][2]) { int i,j; if (a[0][0]) printf("K%c%d",'a'+a[0][1]-1,9-a[0][0]); if (a[1][0]) printf(",Q%c%d",'a'+a[1][1]-1,9-a[1][0]); if (a[2][0]0;j--) for(i=8;i<16;i++) if (a[i][0]&&a[i][0]==j) printf(",%c%d",'a'+a[i][1]-1,9-a[i][0]); } int main() { char t[50]; int i,j,p=0,p1=0; int white[16][2]={0},black[16][2]={0}; scanf("%s",t); for(i=0;i<8;i++) { scanf("%s",t); for(j=2;j<33;j=j+4) { switch(t[j]) { case 'k': black[0][0]=i+1; black[0][1]=(j-2)/4+1; break; case 'q': black[1][0]=i+1; black[1][1]=(j-2)/4+1; break; case 'r': if(black[2][0]) { black[3][0]=i+1; black[3][1]=(j-2)/4+1; break; } else { black[2][0]=i+1; black[2][1]=(j-2)/4+1; break; } case 'b': if(black[4][0]) { black[5][0]=i+1; black[5][1]=(j-2)/4+1; break; } else { black[4][0]=i+1; black[4][1]=(j-2)/4+1; break; } case 'n': if(black[6][0]) { black[7][0]=i+1; black[7][1]=(j-2)/4+1; break; } else { black[6][0]=i+1; black[6][1]=(j-2)/4+1; break; } case 'p': black[8+p][0]=i+1; black[8+p][1]=(j-2)/4+1; p++; break; //white case 'K': white[0][0]=i+1; white[0][1]=(j-2)/4+1; break; case 'Q': white[1][0]=i+1; white[1][1]=(j-2)/4+1; break; case 'R': if(white[2][0]) { white[3][0]=i+1; white[3][1]=(j-2)/4+1; break; } else { white[2][0]=i+1; white[2][1]=(j-2)/4+1; break; } case 'B': if(white[4][0]) { white[5][0]=i+1; white[5][1]=(j-2)/4+1; break; } else { white[4][0]=i+1; white[4][1]=(j-2)/4+1; break; } case 'N': if(white[6][0]) { white[7][0]=i+1; white[7][1]=(j-2)/4+1; break; } else { white[6][0]=i+1; white[6][1]=(j-2)/4+1; break; } case 'P': white[8+p1][0]=i+1; white[8+p1][1]=(j-2)/4+1; p1++; break; } } scanf("%s",t); } printf("White: "); outputw(white); printf("nBlack: "); outputb(black); printf("n"); system("pause"); return 0; }