标签:for include turn contain idt sts astar log ack
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 14504 | Accepted: 8110 |
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<iostream> #include<queue> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> using namespace std; struct knight{ int x,y,step; int g,h,f; bool operator < (const knight &k) const{ return f > k.f; } }k; bool visited[8][8]; int x2,y2,ans; int dir[8][2] = {{-2,-1},{-2,1},{2,-1},{2,1},{-1,-2},{-1,2},{1,-2},{1,2}}; 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){ return (abs(a.x-x2)+abs(a.y-y2))*10; } void Astar(){ knight t,s; while(!que.empty()){ t=que.top(); que.pop(); visited[t.x][t.y] = true; if(t.x==x2&&t.y==y2){ ans=t.step; break; } for(int i=0;i<8;i++){ s.x=t.x+dir[i][0]; s.y=t.y+dir[i][1]; if(in(s)&&!visited[s.x][s.y]){ s.g=t.g+23; s.h=Heuristic(s); s.f=s.g+s.h; s.step=t.step+1; que.push(s); } } } } int main(){ char line[5]; int x1,y1; while(gets(line)){ x1=line[0]-‘a‘;y1=line[1]-‘1‘; x2=line[3]-‘a‘;y2=line[4]-‘1‘; memset(visited,false,sizeof(visited)); k.x=x1; k.y=y1; 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; }
标签:for include turn contain idt sts astar log ack
原文地址:http://www.cnblogs.com/cangT-Tlan/p/7469983.html