8月2日做题还是主题-业余工作-帮忙做西电ACM网站

        昨天本来打算写BLOG,但是CSDN写BLOG的窗口始终进不去。昨天是建军节。ACM队的老师找我做介绍ACM的网站。我们学校第一次举办如此大赛,我当然很乐意的答应了。当天下午,由于PKU上有周赛,因此没有开始动工,说到周赛,我AC了一道,wa了一道,还有一道,死活想不出怎么得到答案的,不过想想,这三道题我还是可以写出来了。比赛完后我就开始动手做网站了。到网上看看有没有合适的模板。找了几个漂亮的。但是同学说太花了,虽然我做了快一个晚上,这个晚上可能所有的成果都泡汤,不过我觉得简约和大气也是一种美。今天我去了中山大学的ACM网站看了,去了上海交大ACM网站看了。心里也有底的。估计模板我自己做,嵌入CMS管理系统就差不多了。 今天做了大概六道题,有一个题让我特别的兴奋,特放上来共享,这题其实不难,但是花了我挺长时间做出来的。

我的程序代码:

/*

Distance on Chessboard
Time Limit:1000MS  Memory Limit:10000K
Total Submit:6652 Accepted:2155

Description
国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示:


王、后、车、象的走子规则如下:

  • 王:横、直、斜都可以走,但每步限走一格。
  • 后:横、直、斜都可以走,每步格数不受限制。
  • 车:横、竖均可以走,不能斜走,格数不限。
  • 象:只能斜走,格数不限。



写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。

 

Input
第一行是测试数据的组数t(0 <= t <= 20)。以下每行是一组测试数据,每组包括棋盘上的两个位置,第一个是起始位置,第二个是目标位置。位置用"字母-数字"的形式表示,字母从"a"到"h",数字从"1"到"8"。

Output
对输入的每组测试数据,输出王、后、车、象所需的最少步数。如果无法到达,就输出"Inf".

Sample Input

 

Sample Output

 

Source
POJ Monthly--2004.05.15 Liu Rujia@POJ

*/

#include "iostream"

using namespace std;

int main()
{
	int map[9][9],step,x,y,dx,dy;
	char ch1[3],ch2[3];

	int n,flag;
	cin>>n;
	while(n)
	{
		cin>>ch1>>ch2;
		dx=ch2[0]-'a'+1;
		dy=ch2[1]-'0';
		x=ch1[0]-'a'+1;
		y=ch1[1]-'0';
		step=0;
		if(x==dx&&y==dy)
			cout<<0<<" ";
		else
		{
			step=abs(x-dx)>abs(y-dy)?abs(x-dx):abs(y-dy);
			cout<<step<<" ";
		}
		if(x==dx&&y==dy)
			step=0;
		else if(abs(x-dx)==abs(y-dy))
		{
			step=1;
		}
		else if(abs(x-dx)==0||abs(y-dy)==0)
		{
			step=1;
		}
		else
			step=2;
		cout<<step<<" ";
		if(x==dx&&y==dy)
			step=0;
		else if((abs(x-dx)==0||abs(y-dy)==0)&&abs(x-dx)!=abs(y-dy))
			step=1;
		else
			step=2;
		cout<<step<<" ";
		flag=0;
		if(x==dx&&y==dy)
			step=0;
		else if(abs(x-dx)==abs(y-dy)&&abs(x-dx))
			step=1;
		else if(abs(abs(y-dy)-abs(x-dx))%2)
		{
			flag=1;
			cout<<"Inf"<<endl;
		}
		else if(abs(y-dy)>abs(x-dx)&&!(abs(abs(y-dy)-abs(x-dx))%2))
		{
			if(dy+(abs(abs(y-dy)-abs(x-dx))/2)<=8||dy-(abs(abs(y-dy)-abs(x-dx))/2)>=1)
				step=2;
			else if(y+(abs(abs(y-dy)-abs(x-dx))/2)<=8||y-(abs(abs(y-dy)-abs(x-dx))/2)>=1)
				step=3;
			else
			{
				flag=1;
				cout<<"Inf"<<endl;
			}
		}
		else if(abs(x-dx)>abs(y-dy)&&!((abs(abs(y-dy)-abs(x-dx))%2)))
		{
			if(dx+(abs(abs(y-dy)-abs(x-dx))/2)<=8||dx-(abs(abs(y-dy)-abs(x-dx))/2)>=1)
				step=2;
			else if(x+(abs(abs(y-dy)-abs(x-dx))/2)<=8||x-(abs(abs(y-dy)-abs(x-dx))/2)>=1)
				step=3;
			else
			{
				flag=1;
				cout<<"Inf"<<endl;
			}
		}
		else
		{
			flag=1;
			cout<<"Inf"<<endl;
		}
		if(!flag)
			cout<<step<<endl;
		n--;
	}
	return 0;
}

2 1 2 1
3 1 1 Inf

2
a1 c3
f5 f8
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值