#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<queue>
#define N 6
using namespace std;
class Node
{
public:
int x, y;
int F, G, H;
Node(int a, int b):x(a), y(b){}
bool operator < (const Node &a) const
{
return F > a.F;
}
};
int dir[8][2] = {{-1,-1}, {-1, 0}, {-1, 1}, {0, -1},
{0, 1}, {1, -1}, {1, 0}, {1, 1}};
priority_queue<Node>que;
int map[N][N] = { {0,0,0,0,0,0},
{0,1,1,0,1,1},
{0,0,1,0,0,0},
{0,0,1,1,1,0},
{0,1,0,0,0,0},
{1,1,0,0,0,0} };
bool visit[N][N];
int valF[N][N];
int path[N][N][2];
int Manhuattan(int x, int y, int x1, int y1);
bool NodeIsLegal(int x, int y, int xx, int yy);
void A_start(int x0, int y0, int x1, int y1);
void PrintPath(int x1, int y1);
int main()
{
fill(visit[0], visit[0]+N*N, false);
fill(valF[0], valF[0]+N*N, 0);
fill(path[0][0], path[0][0]+N*N*2, -1);
int x0, y0, x1, y1;
cout<<"输入起点:";
cin>>x0>>y0;
cout<<"输入终点:";
cin>>x1>>y1;
x0--; y0--; x1--; y1--;
if(!NodeIsLegal(x0, y0, x0, y0))
{
cout<<"非法起点!"<<endl;
return 0;
}
A_start(x0, y0, x1, y1);
PrintPath(x1, y1);
}
void A_start(int x0, int y0, int x1, int y1)
{
Node node(x0, y0);
node.G = 0;
node.H = Manhuattan(x0, y0, x1, y1);
node.F = node.G + node.H;
valF[x0][y0] = node.F;
que.push(node);
while(!que.empty())
{
Node node_top = que.top(); que.pop();
visit[node_top.x][node_top.y] = true;
if(node_top.x == x1 && node_top.y == y1)
break;
for(int i=0; i<8; i++)
{
Node node_next(node_top.x + dir[i][0], node_top.y + dir[i][1]);
if(NodeIsLegal(node_next.x, node_next.y, node_top.x, node_top.y) && !visit[node_next.x][node_next.y])
{
node_next.G = node_top.G + int(sqrt(pow(dir[i][0],2)+pow(dir[i][1],2))*10);
node_next.H = Manhuattan(node_next.x, node_next.y, x1, y1);
node_next.F = node_next.G + node_next.H;
if(node_next.F < valF[node_next.x][node_next.y] || valF[node_next.x][node_next.y] == 0)
{
path[node_next.x][node_next.y][0] = node_top.x;
path[node_next.x][node_next.y][1] = node_top.y;
valF[node_next.x][node_next.y] = node_next.F;
que.push(node_next);
}
}
}
}
}
void PrintPath(int x1, int y1)
{
if(path[x1][y1][0] == -1 || path[x1][y1][1] == -1)
{
cout<<"没有可行路径!"<<endl;
return;
}
int x = x1, y = y1;
int a, b;
while(x != -1 || y != -1)
{
map[x][y] = 2;
a = path[x][y][0];
b = path[x][y][1];
x = a;
y = b;
}
string s[3] = {"□", "█", "☆"};
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
cout<<s[map[i][j]];
cout<<endl;
}
}
int Manhuattan(int x, int y, int x1, int y1)
{
return (abs(x - x1) + abs(y - y1)) * 10;
}
bool NodeIsLegal(int x, int y, int xx, int yy)
{
if(x < 0 || x >= N || y < 0 || y >= N) return false;
if(map[x][y] == 1) return false;
if(x != xx && y != yy && (map[x][yy] == 1 || map[xx][y] == 1)) return false;
return true;
}