空地到空地的步数是1, 空地到墙的步数是2(轰一炮+移过去)
node(int x, int y, int step){
int dir[4][2]={0, 1, 1, 0, -1, 0, 0, -1};
bool operator >(node a, node b){
priority_queue<node, vector<node>, greater<node> >q;
if(map[cur.x][cur.y]=='T'){
if(map[xx][yy]=='R' || map[xx][yy]=='S') continue;
else if(map[xx][yy]=='T'){
else if(map[xx][yy]=='B')
q.push(node(xx, yy, cur.step+2));
q.push(node(xx, yy, cur.step+1));
while(cin>>n>>m && (n || m)){
map[i][0]=map[i][m+1]='R';
map[0][j]=map[n+1][j]='R';
while(!q.empty()) q.pop();
将map[i][j]映射到 i*m+j的节点上,建立节点与节点之间的权值的关系!
B->B的权值为1, E->B的权值为2, S<->... R<->... 的权值为INF(也就是没有边存在)
在注意一点就是B->E的权值是 1,因为如果到B了,说明炮弹已经将墙轰掉了!
建立好图之后,那么就是求源点到终点的最短的距离了!
int dir[4][2]={0, 1, 1, 0, -1, 0, 0, -1};
memset(vis, 0, sizeof(vis));
memset(d, 0x3f, sizeof(d));
int u=q.front(); q.pop();
for(int i=0; i<len; ++i){
if(d[v] > d[u] + g[u][i].dist){
d[v] = d[u] + g[u][i].dist;
if(d[tt]==INF) return false;
while(cin>>n>>m && (n||m)){
if(map[i][j]=='Y') ss=from;
else if(map[i][j]=='T') tt=from;
else if(map[i][j]=='R' || map[i][j]=='S') continue;
if(x<0 || x>=n || y<0 || y>=m) continue;
if(map[x][y]=='R' || map[x][y]=='S') continue;
if(map[i][j]=='B' || map[x][y]=='B') dist=2;
if(map[i][j]=='B' && map[x][y]!='B') dist=1;
g[from].push_back(node(to, dist));