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