--大致题意和思想
大致题意:
1、不论黑白,KQRBN P均是依次输出,强制大写,但不输出“P”,只输出其坐标
2、对白棋的位置,小行优先大行输出(行的数字越小则优先)同行则按列的顺序(a~h)
3、对黑棋的位置,大行优先小行输出(行的数字越大则优先)同行则按列的顺序(a~h)
4、棋子可能不齐全,不存在的棋子不输出,用标记解决
5、最后的棋子后面不带逗号,要找出最后的棋子
主要思想:
6、从2、3点可以看出,黑棋总是先被输入,白棋总是后输入,即黑棋总在棋盘上方,白棋总在棋盘下方,所以输入完成后,对于黑色棋子只需要按类型次序输出,同类型棋子的顺序就是输入的顺序;而白色棋子要考虑同类型棋子之间的排序,而同类型棋子之间又仅需要考虑不同行棋子之间的排序,同一行棋子的排序就是输入顺序。
题意和思想转自https://www.cnblogs.com/sasuke-/p/5118086.html
AC代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
char white[] = {'K','Q','R','B','N','P'};
char black[] = {'k','q','r','b','n','p'};
char color[] = {'K','Q','R','B','N','P'};
char g[10][10];
int main()
{
char s[100];//用来接收方框
char a, b, c, d;
//接受字符操作
gets(s);
for(int i = 7; i >= 0; i-- ) //这样是为了把白棋放在上面,黑棋放在下面
{
getchar();//每行开头接匹配掉字符‘|’
for(int j = 0; j <= 7; j++)
{
scanf("%c%c%c%c",&a,&b,&c,&d);
g[i][j] = b;
}
getchar();//匹配换行符
gets(s);//接受下面的方框线
}
int flag = 0;//控制逗号
printf("White: ");//小行优先大行输出
for(int k = 0; k < 6; k++) //6个字母
{
for(int i = 0; i <= 7; i++) //行
{
for(int j = 0; j <= 7;j++) //列
{
if(g[i][j] == white[k])
{
if(flag) cout << ",";
if(g[i][j] != 'P') printf("%c%c%d",color[k],j + 'a',i + 1);
else printf("%c%d",j + 'a',i + 1);
flag = 1;
}
}
}
}
cout << endl;
printf("Black: ");//黑色优先从大行输出
flag = 0;
for(int k= 0; k < 6; k++)
{
for(int i = 7; i >= 0; i--)
{
for(int j = 0; j <= 7; j++)
{
if(g[i][j] == black[k])
{
if(flag) cout << ',';
if(g[i][j] != 'p') printf("%c%c%d",color[k],j + 'a',i + 1);
else printf("%c%d",j + 'a', i + 1);
flag = 1;
}
}
}
}
printf("\n");
return 0;
}