题意简述
将一个棋盘翻译为文字表达。如下:
+---+---+---+---+---+---+---+---+ |.r.|:::|.b.|:q:|.k.|:::|.n.|:r:| +---+---+---+---+---+---+---+---+ |:p:|.p.|:p:|.p.|:p:|.p.|:::|.p.| +---+---+---+---+---+---+---+---+ |...|:::|.n.|:::|...|:::|...|:p:| +---+---+---+---+---+---+---+---+ |:::|...|:::|...|:::|...|:::|...| +---+---+---+---+---+---+---+---+ |...|:::|...|:::|.P.|:::|...|:::| +---+---+---+---+---+---+---+---+ |:P:|...|:::|...|:::|...|:::|...| +---+---+---+---+---+---+---+---+ |.P.|:::|.P.|:P:|...|:P:|.P.|:P:| +---+---+---+---+---+---+---+---+ |:R:|.N.|:B:|.Q.|:K:|.B.|:::|.R.| +---+---+---+---+---+---+---+---+
大写字母表示白方,小写表示黑方。输出时按照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个。
程序样例
#include<stdio.h> void 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] < a[3][0]) { if (a[3][0]) printf(",R%c%d", 'a' + a[3][1] - 1, 9 - a[3][0]); if (a[2][0]) printf(",R%c%d", 'a' + a[2][1] - 1, 9 - a[2][0]); } else { 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] < a[5][0]) { if (a[5][0]) printf(",B%c%d", 'a' + a[5][1] - 1, 9 - a[5][0]); if (a[4][0]) printf(",B%c%d", 'a' + a[4][1] - 1, 9 - a[4][0]); } else { 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] < a[7][0]) { if (a[7][0]) printf(",N%c%d", 'a' + a[7][1] - 1, 9 - a[7][0]); if (a[6][0]) printf(",N%c%d", 'a' + a[6][1] - 1, 9 - a[6][0]); } else { 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 (j = 8; j > 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; }