题目链接:这里
题意:打印棋盘上棋子的位置。
解法:
研究一下输出:
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
总共有K,Q,R,B,N,P六种棋子。其中除了P以外所有的棋子在输出位置的同时也要输出棋子的类型。例如:Ke1 , 指的是位于第一行(注意这里的行数,规定最下面那一行开始,也就是和我们常规数组的标号相反),第e列(列数从小到大a-h和1-8是一样的)的K棋。
这题有几个地方需要注意:
1,棋盘中大写字母表示的是白方棋子,小写是黑方。
2,注意棋盘的行数是从最下面开始计数的。和数组的下标相反。也就是说数组行数为8的棋盘行 数为1(数组从1开始)。
3,最容易忽略也最重要的是:白旗和黑棋在输出的时候其实排序规则是不一样的(但是棋子的类型都要按照KQRBNP顺序)。
主要是行列的优先问题:
白棋先按行数(棋盘的行编号)升序排,然后按照列升序排。解决办法:按行升序扫描输出。
黑棋先按行数(棋盘的编号)降序排,然后按照列升序排。解决办法:按行降序扫描输出。
输出的时候主要是要注意一下循环扫描的顺序就行了。

//POJ 2996

#include <stdio.h>
#include <string.h>
#include <iostream>
char mp[40][40];

int main()
{
    for(int i = 0; i < 17; i++) scanf("%s", mp[i]);
    printf("White: ");
    //K
    for(int i = 15; i >= 1; i -= 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'K'){
                printf("K");
                printf("%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    //Q
    for(int i = 15; i >= 1; i -= 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'Q'){
                printf(",Q");
                printf("%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    //R
    for(int i = 15; i >= 1; i -= 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'R'){
                printf(",R");
                printf("%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    //B
    for(int i = 15; i >= 1; i -= 2){
        for(int j = 2; j <= 30; j += 4){
           if(mp[i][j] == 'B'){
                printf(",B");
                printf("%c%d", 'a'+j/4, 8-i/2);
           }
        }
    }
    //N
    for(int i = 15; i >= 1; i -= 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'N'){
                printf(",N");
                printf("%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    //P
    for(int i = 15; i >= 1; i-= 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'P'){
                printf(",%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    printf("\n");
    printf("Black: ");
    //k
    for(int i = 1; i <= 15; i += 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'k'){
                printf("K");
                printf("%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    //q
    for(int i = 1; i <= 15; i += 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'q'){
                printf(",Q");
                printf("%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    //R
    for(int i = 1; i <= 15; i += 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'r'){
                printf(",R");
                printf("%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    //B
    for(int i = 1; i <= 15; i += 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'b'){
                printf(",B");
                printf("%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    //N
    for(int i = 1; i <= 15; i += 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'n'){
                printf(",N");
                printf("%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    //P
    for(int i = 1; i <= 15; i += 2){
        for(int j = 2; j <= 30; j += 4){
            if(mp[i][j] == 'p'){
                printf(",%c%d", 'a'+j/4, 8-i/2);
            }
        }
    }
    printf("\n");
    return 0;
}