This problem is a reverse case of the problem 2996. You are given the output of the problem H and your task is to find the corresponding input.
Input
according to output of problem 2996.
Output
according to input of problem 2996.
Sample Input
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
Sample Output
+---+---+---+---+---+---+---+---+
|.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.|
+---+---+---+---+---+---+---+---+
题目中神奇的2996:戳下边:
http://poj.org/problem?id=2996
思路:就是2996的逆思路,给出位置,输出棋盘。。
第一行给出白色棋的位置,第二行给出黑色棋的位置。
输入是按照"K" (King), “Q” (Queen), “R” (Rook), “B” (Bishop), “N” (Knight), “P” (Pawn).的顺序给出,但是输入的没有P这个字母。
其实输入是有顺序的,但是这道题跟顺序无关。
就记住,逗号之间的字母数字代表:字母a到h,是1到8列;数字1到8,是8到1行。。
代码思路:建立一个8*8的字符数组,用来存储棋盘中的冒号(:)或句号(.)或字母(KQRBNPkqrbnp),其他的棋盘格式符号都是有规律的了,就判断输出就OK。
首先初始化二维数组,观察棋盘,发现:第I行J列,如果I+J为奇数,就是冒号,偶数就是句号(方便整体输出)
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<math.h>
#include<string> //丢了个头文件,本地运行没问题,提交就没过。。
using namespace std;
char I[10][10];
int main()
{
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
I[i][j]=((i+j)%2==0)?'.':':';//看题中的图分析,,是冒号还是句号
string a;
getline(cin,a);//直接输入一行,好遍历。。
for(int i=7;i<a.size();i++)//前边的白黑单词一共占了坐标前6位。。。直接接过去就OK
{
if(a[i]=='K')//简单暴力的分了6种情况,好理解,反正就是先写一种,再CV5次嘛,,
{
int y=a[i+1]-'a'+1;//列坐标
int x=a[i+2]-'0';//行坐标
x=9-x;//行坐标是反的
I[x][y]='K';
i += 3;//接着往后遍历
}
else if(a[i]=='Q')
{
int y=a[i+1]-'a'+1;
int x=a[i+2]-'0';
x=9-x;
I[x][y]='Q';
i += 3;
}
else if(a[i]=='R')
{
int y=a[i+1]-'a'+1;
int x=a[i+2]-'0';
x=9-x;
I[x][y]='R';
i += 3;
}
else if(a[i]=='B')
{
int y=a[i+1]-'a'+1;
int x=a[i+2]-'0';
x=9-x;
I[x][y]='B';
i += 3;
}
else if(a[i]=='N')
{
int y=a[i+1]-'a'+1;
int x=a[i+2]-'0';
x=9-x;
I[x][y]='N';
i += 3;
}
else
{
int y=a[i]-'a'+1;
int x=a[i+1]-'0';
x=9-x;
I[x][y]='P';
i += 2;//注意,CV的时候,别+3了。。
}
}
//CV上边的,改成小写字母
getline(cin,a);
for(int i=7;i<a.size();i++)
{
if(a[i]=='K')
{
int y=a[i+1]-'a'+1;
int x=a[i+2]-'0';
x=9-x;
I[x][y]='k';
i += 3;
}
else if(a[i]=='Q')
{
int y=a[i+1]-'a'+1;
int x=a[i+2]-'0';
x=9-x;
I[x][y]='q';
i += 3;
}
else if(a[i]=='R')
{
int y=a[i+1]-'a'+1;
int x=a[i+2]-'0';
x=9-x;
I[x][y]='r';
i += 3;
}
else if(a[i]=='B')
{
int y=a[i+1]-'a'+1;
int x=a[i+2]-'0';
x=9-x;
I[x][y]='b';
i += 3;
}
else if(a[i]=='N')
{
int y=a[i+1]-'a'+1;
int x=a[i+2]-'0';
x=9-x;
I[x][y]='n';
i += 3;
}
else
{
int y=a[i]-'a'+1;
int x=a[i+1]-'0';
x=9-x;
I[x][y]='p';
i += 2;
}
}
for(int i=1;i<=8;i++)//输出!!!其实就循环4次的 。。i偷偷+1了啊(方便整体输出)
{
cout<<"+---+---+---+---+---+---+---+---+"<<endl;
printf("|.%c.|:%c:|.%c.|:%c:|.%c.|:%c:|.%c.|:%c:|\n",I[i][1],I[i][2],I[i][3],I[i][4],I[i][5],I[i][6],I[i][7],I[i][8]);
cout<<"+---+---+---+---+---+---+---+---+"<<endl;
i++;
printf("|:%c:|.%c.|:%c:|.%c.|:%c:|.%c.|:%c:|.%c.|\n",I[i][1],I[i][2],I[i][3],I[i][4],I[i][5],I[i][6],I[i][7],I[i][8]);
}
cout<<"+---+---+---+---+---+---+---+---+"<<endl;
return 0;
}