昨天本来打算写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