超级恶心的模拟题 K - Emag eht htiw Em Pleh

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值