From 1c03f7b10ce8492b50630fce83dce6b62ba53734 Mon Sep 17 00:00:00 2001 From: Pavel Date: Tue, 9 Nov 2021 10:05:06 +0100 Subject: [PATCH] fix heuristic in astar.cpp --- synchrod/astar.cpp | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/synchrod/astar.cpp b/synchrod/astar.cpp index dfb8636..eccbf45 100644 --- a/synchrod/astar.cpp +++ b/synchrod/astar.cpp @@ -19,6 +19,12 @@ using namespace std; int deltas[4] = {-16, 16, -1, 1}; +union bytes +{ + int i; + char b[4]; +}; + struct result { double cost; @@ -27,35 +33,38 @@ struct result struct result cost(const vector &t, int players, int exits, int m, int l) { - int i, n, dn, p, e, mask; + int i, n, dn; double c, v; + union bytes p, e; struct result r; - p = players; + p.i = players; + e.i = exits; dn = deltas[m]; c = 1; for(i = 0; i < 4; ++i) { - n = p >> i * 8 & 0xff; - e = exits >> i * 8 & 0xff; - if(n == e) continue; + n = p.b[i]; + if(n == e.b[i]) continue; n += dn; v = t[n + i * l]; if(v < 0) continue; - mask = 0xff << i * 8; - p = (p & ~mask) | (n << i * 8); + p.b[i] = n; c += v; } r.cost = c; - r.players = p; + r.players = p.i; return r; } double heuristic(int u, int d) { - int result, dx[4], i; + int dx[4], i; + union bytes a, b; + a.i = u; + b.i = d; for(i = 0; i < 4; ++i) { - dx[i] = abs(u >> i * 8 & 0xff) % 16 - abs(d >> i * 8 & 0xff) % 16 ; + dx[i] = abs(a.b[i] % 16 - b.b[i] % 16); } return MAX(dx[0], dx[2]) + MAX(dx[1], dx[3]); }