pku 2296 第一周训练——模拟

http://poj.org/problem?id=2996

题意很难理解。给你一个棋盘,分白黑双方,白的用大写字母表示,黑的用小写字母表示。( "K" (King), "Q" (Queen), "R" (Rook), "B" (Bishop), "N" (Knight), or "P" (Pawn)

然后给出位置的描述方法:a,b,c,d,e,f,g,h分表代表列 1--8 分别代表行。然后进行描述。

注意:这里的矩形,最下边是第一行。还有对于白色,同一个棋子行数小得先表示例如样例Ra1,Rh1,Bc1,Bf1; 而对于黑色,同一棋子行数大的先表示 例如样例:Ng8,Nc6

View Code
#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 107
using namespace std;
char str[maxn][maxn],tmp[maxn][maxn];
bool visit[maxn][maxn];
char B[6] ={'k','q','r','b','n','p'};
char W[6] ={'K','Q','R','B','N','P'};
int flag1,flag2;
void find_W(char ch)
{
for (int i = 0; i < 8; ++i)
{
for (int j = 0; j < 8; ++j)
{
if (tmp[i][j] == ch)
{
if (ch != 'P')
{
if (!flag1)
{
printf(" %c%c%d",ch,j + 'a', i + 1);
flag1 = 1;
}
else
printf(",%c%c%d",ch,j + 'a', i + 1);
}
else
{
if (!flag1)
{
printf(" %c%d",j + 'a', i + 1);
flag1 = 1;
}
else
printf(",%c%d",j + 'a', i + 1);
}
}
}
}
}
void find_B(char ch)//黑色的查找要倒着查,因为黑色的对于同一棋子,行数大的先表示。
{
for (int i = 7; i >= 0; --i)
{
for (int j = 0; j < 8; ++j)
{
if (tmp[i][j] == ch)
{
if (ch != 'p')
{
if (!flag2)
{
printf(" %c%c%d",ch - 32,j + 'a', i + 1);
flag2 = 1;
}
else
printf(",%c%c%d",ch - 32,j + 'a', i + 1);
}
else
{
if (!flag2)
{
printf(" %c%d",j + 'a', i + 1);
flag2 = 1;
}
else
printf(",%c%d",j + 'a', i + 1);
}
}
}
}
}
int main()
{
//freopen("data.in","r",stdin);
int i,j;
for (i = 0; i < 17; ++i)
gets(str[i]);
flag1 = flag2 = 0;
int x = -1;
int y = 0;
for (i = 15; i >= 1; i = i - 2)//将所需数据从所给矩形里面抠出来。要倒着扣
{
x++; y =0;
for (j = 2; j < 33; j += 4)
tmp[x][y++] = str[i][j];
}
printf("White:");
for (i = 0; i < 6; ++i)//循环查找
find_W(W[i]);
printf("\n");

printf("Black:");
for (i = 0; i < 6; ++i)//循环查找
find_B(B[i]);
printf("\n");
return 0;
}



你可能感兴趣的:(pku)