Emag eht htiw Em Pleh POJ - 2993

6 篇文章 1 订阅

Emag eht htiw Em Pleh POJ - 2993

题目链接:https://vjudge.net/problem/POJ-2993
题意:Help Me with the Game POJ - 2996的逆版本,给你黑白棋子的描述,请你输出这个棋盘。具体的定义见 https://vjudge.net/problem/POJ-2996
输入:
在这里插入图片描述
输出:
在这里插入图片描述

思路:模拟,2996做完了这题应该没有什么难度。重点如下:
1.棋子描述 [type] [column] [row]的结构体编写。
2.找到棋盘上行列和棋子位置行列对应关系。
3.找到棋盘上行列’:‘和’.‘的放置特点,容易看出与其(i+j)的奇偶性有关。
4.将输入的字符串转化成white和black的位置。从’,'下手即可。

具体见代码:

#include<iostream>
#include<map>
using namespace std;
struct pos{//位置描述
	int type_toint;
	char type;
	int x,y;
}p[107];
pos white[107];
pos black[107];
char ma[24][42];
int main(){
	string white_s;
	string black_s;
	getline(cin,white_s);
	getline(cin,black_s);
	int i;
	int cnt_w=0;
	int cnt_b=0;
	//white
	//cout<<"w!\n";
	string per="";
	int len_w=white_s.size();
	//将字符串转化为white的位置
	for(i=7;i<white_s.size();i++){
		if(white_s[i]!=','&&i!=len_w-1){
			per+=white_s[i];
		}
		else {
			if(i==len_w-1)per+=white_s[i];;
			cnt_w++;
			if(per.size()==3)
			{ 
				white[cnt_w].type=per[0];
				white[cnt_w].x=per[2]-'0';
				white[cnt_w].y=(int)per[1]-96;
			}
			else{//2
				white[cnt_w].type='P';
				white[cnt_w].x=per[1]-'0';
				white[cnt_w].y=(int)per[0]-96;
			}
			per="";
		}
	}
	将字符串转化为black的位置
	//cout<<"b!\n";
	per="";
	int len_b=black_s.size();
	for(i=7;i<black_s.size();i++){
		if(black_s[i]!=','&&i!=len_b-1){
			per+=black_s[i];
		}
		else{
			if(i==len_b-1)per+=black_s[i];
			cnt_b++;
			if(per.size()==3)
			{ 
				black[cnt_b].type=(char)((int)per[0]+32);
				black[cnt_b].x=per[2]-'0';
				black[cnt_b].y=(int)per[1]-96;
			}
			else{//2
				black[cnt_b].type='p';
				black[cnt_b].x=per[1]-'0';
				black[cnt_b].y=(int)per[0]-96;
			}
			per="";
		}
	}
	
	//check
//	for(i=1;i<=cnt_b;i++){
//		cout<<black[i].type<<" "<<black[i].x<<" "<<black[i].y<<endl; 
//	} 
	int j;
	int row,c;
	row=0;
	c=0;
	//cout<<"oper!\n";
	for(i=0;i<=16;i++){
		//cout<<"i="<<i<<endl;
		if(i%2==0){
			//cout<<"even>\n";
			string sim="+---+---+---+---+---+---+---+---+";
			for(int id=0;id<=32;id++)ma[i][id]=sim[id];
		}
		else{
			for(j=0;j<=32;j++){
			//	cout<<"j="<<j<<endl;
				row=8-((i+2-1)/2-1);
				c=j/4+1;
				if(j%4==0){
					ma[i][j]='|';
				}
				else{
				//奇偶性判断放'.'还是':"
					if(1){
						if((row+c)%2!=0)ma[i][j]='.';
						else ma[i][j]=':';
					}
				}
			}
		}
	}
	//cout<<"chess!\n";
	//chess
	//white
	for(i=1;i<=cnt_w;i++){
		char c=white[i].type;
		int xx=white[i].x;
		int yy=white[i].y;
		int ii=15-(xx-1)*2;
		int jj=2+(yy-1)*4;
		ma[ii][jj]=c;
	}
	//black
	for(i=1;i<=cnt_w;i++){
		char c=black[i].type;
		int xx=black[i].x;
		int yy=black[i].y;
		//也许有更好的处理方式
		int ii=15-(xx-1)*2;//行对应关系
		int jj=2+(yy-1)*4;//列对应关系
		ma[ii][jj]=c;
	}
	//cout<<"ans:\n";
	for(i=0;i<=16;i++){
		for(j=0;j<=32;j++)cout<<ma[i][j];
		cout<<endl;
	}
	//cout<<">>>\n";
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值