POJ2993

POJ原址:POJ2993

死掉了无数脑细胞,终于结束了这两个棋盘,回想起乍一看去,棋盘长得有多奇异,结果现在都能自己还原了,难得。

程序实在太简太长,好烦,看看别人怎么做的。

别人的比我确实行数少了好多,小优是用了结构体做的,还有包括之前那题,有用find做的,find是虾米,待会再看吧。

一步一步把棋盘还原出来,还是很艰辛的,该做点别的了,暑期社会实践报告come on~



程序:

//看了一眼discuss就让我不得不知竟然white和black还要考虑先后输入,呵呵呵呵,这算好事坏事
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int i,j,k=0,p=0;
	char temp1[1000],temp2[1000],var[1000],varp[100];
    int x[100],y[100],px[100],py[100];
	memset(var,0,sizeof(var));
	memset(x,0,sizeof(x));memset(y,0,sizeof(y));
	memset(varp,0,sizeof(varp));
	memset(px,0,sizeof(x));memset(py,0,sizeof(x));
	int len1,len2;
	cin.getline(temp1,1000);
	cin.getline(temp2,1000);
	len1=strlen(temp1);
	len2=strlen(temp2);
	if(temp1[0]=='W')
	{
    	for(i=7;i<=len1;i++)
    	{
    		if(temp1[i]=='K'||temp1[i-1]=='K'||temp1[i-2]=='K')
    		{
    			if(i%4==3)
    			var[k]='K';
    			else if(i%4==0)
				x[k]=temp1[i]-'a';
    			else if(i%4==1)
    			y[k++]=temp1[i]-'1';
    		}
    		if(temp1[i]=='Q'||temp1[i-1]=='Q'||temp1[i-2]=='Q')
    		{
    			if(i%4==3)
    			var[k]='Q';
    			else if(i%4==0)
    			x[k]=temp1[i]-'a';
    			else if(i%4==1)
    			y[k++]=temp1[i]-'1';
    		}
    		if(temp1[i]=='R'||temp1[i-1]=='R'||temp1[i-2]=='R')
    		{
    			if(i%4==3)
    			var[k]='R';
    			else if(i%4==0)
    			x[k]=temp1[i]-'a';
    			else if(i%4==1)
    			y[k++]=temp1[i]-'1';
    		}
    		if(temp1[i]=='B'||temp1[i-1]=='B'||temp1[i-2]=='B')
    		{
    			if(i%4==3)
    			var[k]='B';
    			else if(i%4==0)
    			x[k]=temp1[i]-'a';
    			else if(i%4==1)
    			y[k++]=temp1[i]-'1';
    		}
    		if(temp1[i]=='N'||temp1[i-1]=='N'||temp1[i-2]=='N')
    		{
    			if(i%4==3)
    			var[k]='N';
    			else if(i%4==0)
    			x[k]=temp1[i]-'a';
    			else if(i%4==1)
    			y[k++]=temp1[i]-'1';
    		}
    		if((temp1[i-1]==','&&temp1[i]>='a'&&temp1[i]<='h')||(temp1[i-2]==','&&temp1[i]>='1'&&temp1[i]<='8'))
    		//这个约束想了半天
    		{
    			int num=6+k*4;
    			if((i-num)%3==1)
    			{
    				varp[p]='P';
    				px[p]=temp1[i]-'a';
    			}
    			else if((i-num)%3==2)
    			py[p++]=temp1[i]-'1';
    		}
    	}
    }
    //至此应该已经将white全部分离
	//接下来构建没有分隔符的map
	char map[8][8];
	memset(map,0,sizeof(map));
	for(i=0;i<=k-1;i++)
		map[7-y[i]][x[i]]=var[i];
	for(i=0;i<=p-1;i++)
    	map[7-py[i]][px[i]]=varp[i];//丫这里xy是反的 
    //white的map构建完成
	
	//开始构建black 
	k=0;
	p=0;
	memset(var,0,sizeof(var));
	memset(x,0,sizeof(x));memset(y,0,sizeof(y));
	memset(varp,0,sizeof(varp));
	memset(px,0,sizeof(x));memset(py,0,sizeof(x));
	if(temp2[0]=='B')
	{
    	for(i=7;i<=len2;i++)
    	{
    		if(temp2[i]=='K'||temp2[i-1]=='K'||temp2[i-2]=='K')
    		{
    			if(i%4==3)
    			var[k]='k';
    			else if(i%4==0)
				x[k]=temp2[i]-'a';
    			else if(i%4==1)
    			y[k++]=temp2[i]-'1';
    		}
    		if(temp2[i]=='Q'||temp2[i-1]=='Q'||temp2[i-2]=='Q')
    		{
    			if(i%4==3)
    			var[k]='q';
    			else if(i%4==0)
    			x[k]=temp2[i]-'a';
    			else if(i%4==1)
    			y[k++]=temp2[i]-'1';
    		}
    		if(temp2[i]=='R'||temp2[i-1]=='R'||temp2[i-2]=='R')
    		{
    			if(i%4==3)
    			var[k]='r';
    			else if(i%4==0)
    			x[k]=temp2[i]-'a';
    			else if(i%4==1)
    			y[k++]=temp2[i]-'1';
    		}
    		if(temp2[i]=='B'||temp2[i-1]=='B'||temp2[i-2]=='B')
    		{
    			if(i%4==3)
    			var[k]='b';
    			else if(i%4==0)
    			x[k]=temp2[i]-'a';
    			else if(i%4==1)
    			y[k++]=temp2[i]-'1';
    		}
    		if(temp2[i]=='N'||temp2[i-1]=='N'||temp2[i-2]=='N')
    		{
    			if(i%4==3)
    			var[k]='n';
    			else if(i%4==0)
    			x[k]=temp2[i]-'a';
    			else if(i%4==1)
    			y[k++]=temp2[i]-'1';
    		}
    		if((temp2[i-1]==','&&temp2[i]>='a'&&temp2[i]<='h')||(temp2[i-2]==','&&temp2[i]>='1'&&temp2[i]<='8'))
    		{
    			int num=6+k*4;
    			if((i-num)%3==1)
    			{
    				varp[p]='p';
    				px[p]=temp2[i]-'a';
    			}
    			else if((i-num)%3==2)
    			py[p++]=temp2[i]-'1';
    		}
    	}
    }
    //至此已经将black全部分离
	//接下来构建没有分隔符的map
	for(i=0;i<=k-1;i++)
		map[7-y[i]][x[i]]=var[i];
	for(i=0;i<=p-1;i++)
    	map[7-py[i]][px[i]]=varp[i];
	//至此,没有:与.的map构建完成
	
	for(i=0;i<8;i++)
    	for(j=0;j<8;j++)
    	{
    		if(map[i][j]==0)
    		{
    			if((i+j)%2==1)//如果i+j是奇数
    			map[i][j]=':';
    			else
    			map[i][j]='.';
    		}
    	}
	//至此map完全构造完毕
	//开始还原棋盘
	int n,m;
	for(i=0;i<17;i++)
	{
		if(i%2==0)
    		cout<<"+---+---+---+---+---+---+---+---+"<<endl;
		else
		{
			n=i/2;
			if(n%2==0)
			{
				cout<<"|.";
				for(m=0;m<7;m++)
				{
					if(m%2==0)
					cout<<map[n][m]<<".|:";
					else
					cout<<map[n][m]<<":|.";
				}
				
				cout<<map[n][7]<<":|"<<endl;
			}
			else
			{
				cout<<"|:";
				for(m=0;m<7;m++)
				{
					if(m%2==0)
					cout<<map[n][m]<<":|.";
					else
					cout<<map[n][m]<<".|:";
				}
				
				cout<<map[n][7]<<".|"<<endl;
			}
		}
	} 
	
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值