华为机试_迷宫问题_启发式搜索(A*算法)
迷宫问题
http://www.nowcoder.com/questionTerminal/cf24906056f4488c9ddb132f317e03bc
启发式搜索, 启发信息为当前位置到终点的曼哈顿距离,具体步骤看代码注释:
#include<bits/stdc++.h>
using namespace std;
int n, m;
queue<pair<int, int> > track;
int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int maze[12][12];
/**
 * 当前点和终点的曼哈顿距离,作为每一步的选择依据
 */
int mhd(int x, int y) {
    return (n - 1 - x) + (m - 1 - y);
}
/**
 * 越界撞墙判断
 */
bool isvail(int x, int y) {
    return !(x < 0 || x >= n || y < 0 || y >= m || maze[x][y] == 1);
}
void search(int x, int y) {
    // 到终点后输出轨迹
    if (x == n - 1 && y == m - 1) {
        while (!track.empty()) {
            pair<int, int> c = track.front();
            track.pop();
            printf("(%d,%d)\n", c.first, c.second);
        }
        return;
    }
    // 遍历四个方向,选择距离最近的做为下一步
    maze[x][y] = 1;
    int next_x, next_y;
    int best_mhd = 999;
    for (int i = 0; i < 4; ++i) {
        int ntx = x + dir[i][0];
        int nty = y + dir[i][1];
        if (isvail(ntx, nty)) {
            // 标记访问过的可行方向,之后不再访问
            maze[ntx][nty] = 1;
            if (mhd(ntx, nty) < best_mhd) {
                best_mhd = mhd(ntx, nty);
                next_x = ntx;
                next_y = nty;
            }
        }
    }
    track.push(pair<int, int>(next_x, next_y));
    search(next_x, next_y);
}
int main() {
    while (cin >> n >> m) {
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                scanf("%d", &maze[i][j]);
            }
        }
        track.push(pair<int, int>(0, 0));
        search(0, 0);
    }
}
 联想公司福利 1500人发布
联想公司福利 1500人发布