POJ 2996 Help Me with the Game (模拟)

题目链接,点这里

--大致题意和思想
大致题意:
1、不论黑白,KQRBN P均是依次输出,强制大写,但不输出“P”,只输出其坐标

2、对白棋的位置,小行优先大行输出(行的数字越小则优先)同行则按列的顺序(a~h)

3、对黑棋的位置,大行优先小行输出(行的数字越大则优先)同行则按列的顺序(a~h)
4、棋子可能不齐全,不存在的棋子不输出,用标记解决

5、最后的棋子后面不带逗号,要找出最后的棋子 

主要思想:
6、从2、3点可以看出,黑棋总是先被输入,白棋总是后输入,即黑棋总在棋盘上方,白棋总在棋盘下方,所以输入完成后,对于黑色棋子只需要按类型次序输出,同类型棋子的顺序就是输入的顺序;而白色棋子要考虑同类型棋子之间的排序,而同类型棋子之间又仅需要考虑不同行棋子之间的排序,同一行棋子的排序就是输入顺序。

题意和思想转自https://www.cnblogs.com/sasuke-/p/5118086.html

AC代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring> 
using namespace std;
char white[] = {'K','Q','R','B','N','P'};
char black[] = {'k','q','r','b','n','p'};
char color[] = {'K','Q','R','B','N','P'};
char g[10][10];

int main()
{
	char s[100];//用来接收方框
	char a, b, c, d;
	
	//接受字符操作 
	gets(s);
	for(int i = 7; i >= 0; i-- ) //这样是为了把白棋放在上面,黑棋放在下面 
	{
		getchar();//每行开头接匹配掉字符‘|’ 
		for(int j = 0;  j <= 7; j++)
		{
			scanf("%c%c%c%c",&a,&b,&c,&d);
			g[i][j] = b; 
		}
		getchar();//匹配换行符
		gets(s);//接受下面的方框线 
	} 
	
	int flag = 0;//控制逗号 
	printf("White: ");//小行优先大行输出
	for(int k = 0; k < 6; k++) //6个字母
	{
		for(int i = 0; i <= 7; i++) //行 
		{
			for(int j = 0; j <= 7;j++) //列 
			{
				if(g[i][j] == white[k])
				{
					if(flag) cout << ",";
				    if(g[i][j] != 'P') printf("%c%c%d",color[k],j + 'a',i + 1);
				    else printf("%c%d",j + 'a',i + 1);
				    flag = 1;
				}
			}
			
		}
	} 
	cout << endl;
	printf("Black: ");//黑色优先从大行输出
	flag = 0;
	for(int k= 0; k < 6; k++)
	{
		for(int i = 7; i >= 0; i--)
		{
			for(int j = 0; j <= 7; j++)
			{
				if(g[i][j] == black[k])
				{
					if(flag) cout << ',';
					if(g[i][j] != 'p') printf("%c%c%d",color[k],j + 'a',i + 1);
					else printf("%c%d",j + 'a', i + 1);
					flag = 1;
				}
			}
		}
	} 
	printf("\n");
	return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值