Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10067 | Accepted: 5676 |
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.
Source
#include <cstdio> #include <cmath> #include <algorithm> #include <iostream> #include <cstring> #include <map> #include <string> #include <stack> #include <cctype> #include <vector> #include <queue> #include <set> using namespace std; const int MAXN = 1010 + 50; const int maxw = 100 + 20; const long long LLMAX = 0x7fffffffffffffffLL; const long long LLMIN = 0x8000000000000000LL; const int INF = 0x7fffffff; const int IMIN = 0x80000000; #define eps 1e10-8 #define mod 1000000007 typedef long long LL; const double PI = acos(-1.0); typedef double D; //#define Online_Judge #define outstars cout << "***********************" << endl; #define clr(a,b) memset(a,b,sizeof(a)) #define FOR(i , x , n) for(int i = (x) ; i < (n) ; i++) #define FORR(i , x , n) for(int i = (x) ; i <= (n) ; i++) #define REP(i , x , n) for(int i = (x) ; i > (n) ; i--) #define REPP(i ,x , n) for(int i = (x) ; i >= (n) ; i--) struct knight { int x , y , step; int g , h , f; bool operator < (const knight &k)const{ return f > k.f; } }k; bool vis[8][8];//已访问标记(关闭列表) int x1 , x2 , y11 , y2 , ans;//起点(x1,y1),终点(x2,y2),最少移动次数ans int dir[8][2] = {{-2 , -1} , {-2 , 1} , {2 , -1} , {2 , 1} , {-1 , -2} , {-1 , 2} , {1 , -2} , {1 , 2}};//8个移动方向 priority_queue <knight> que; //最小优先级队列(开启列表) bool in(const knight&a) { if(a.x < 0||a.y < 0||a.x >= 8||a.y >= 8) { return false; } return true; } int Heuristic (const knight& a)//manhattan估价函数 { return (abs(a.x - x2)+abs(a.y - y2)) * 10; } void Astar() { knight t , s; while(!que.empty()) { t = que.top(); que.pop(); vis[t.x][t.y] = true; if(t.x == x2&&t.y == y2) { ans = t.step; break; } FOR(i ,0 , 8) { s.x = t.x + dir[i][0] ; s.y = t.y + dir[i][1] ; if(in(s)&&!vis[s.x][s.y]) { s.g = t.g + 23; ///23表示根号5乘以10再取其ceil s.h = Heuristic(s); s.f = s.g + s.h; s.step = t.step + 1; que.push(s); } } } } int main() { ios::sync_with_stdio(false); #ifdef Online_Judge freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif // Online_Judge char line[5]; while(gets(line)) { x1 = line[0] - 'a'; y11 = line[1] - '1'; x2 = line[3] - 'a'; y2 = line[4] - '1'; clr(vis , 0); k.x = x1 , k.y = y11 , k.g = k.step = 0 , k.h = Heuristic(k) , k.f = k.g + k.h; while(!que.empty())que.pop(); que.push(k); Astar(); printf("To get from %c%c to %c%c takes %d knight moves.\n" , line[0] , line[1] , line[3] , line[4] , ans); } return 0; }