| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 11794 | Accepted: 6646 | 
Description
Input
Output
Sample Input
e2 e4 a1 b2 b2 c3 a1 h8 a1 h7 h8 a1 b1 c3 f6 f6
Sample Output
To get from e2 to e4 takes 2 knight moves. To get from a1 to b2 takes 4 knight moves. To get from b2 to c3 takes 2 knight moves. To get from a1 to h8 takes 6 knight moves. To get from a1 to h7 takes 5 knight moves. To get from h8 to a1 takes 6 knight moves. To get from b1 to c3 takes 1 knight moves. To get from f6 to f6 takes 0 knight moves.
题意:国际象棋中,给出骑士的起始位置和目标位数,求骑士最少走几步就能到达目标位置。
解题思路:简单bfs,不明白为什么用c++提交TLE,G++提交AC;
#include <iostream>
#include <queue>
#include <string.h>
#include <stdio.h>
using namespace std;
struct point{
	int x,y;
	int step;
};
int a[]={-1, 1,-2, 2,-2, 2,-1, 1};
int b[]={-2,-2,-1,-1, 1, 1, 2, 2};
bool map[10][10];
int bfs(point start,point end){
	queue<point> q;
	start.step=0;
	q.push(start);
	while (q.size()){
		point p=q.front();
		if (p.x==end.x && p.y==end.y){
			return p.step;
		}
		for (int i=0;i<8;i++){	
			if (p.x+a[i]<0 || p.x+a[i]>7 || p.y+b[i]<0 || p.y+b[i]>7 || map[p.x+a[i]][p.y+b[i]]==true)
				continue;	
			point s;
			s.x=p.x+a[i];
			s.y=p.y+b[i];
			s.step=p.step+1;
			q.push(s);
		}
		map[p.x][p.y]=true;
		q.pop();
	}
	return -1;
}
int main(){
	char start[3],end[3];
	while (cin>>start>>end){		
		memset(map,false,sizeof(map));
		point starts,ends;
		starts.x=start[0]-'a';
		starts.y=start[1]-'1';
		ends.x=end[0]-'a';
		ends.y=end[1]-'1';
		cout<<"To get from "<<start<<" to "<<end<<" takes "<<bfs(starts,ends)<<" knight moves."<<endl;
	}
	return 0;
}原文:http://blog.csdn.net/codeforcer/article/details/41357999