IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    POJ-2996 解题报告

    林 达意发表于 2012-07-14 14:45:21
    love 0

    题意简述

    将一个棋盘翻译为文字表达。如下:

    大写字母表示白方,小写表示黑方。输出时按照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
    
    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]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;
    }
    


沪ICP备19023445号-2号
友情链接