剪支迷宫法

来源:互联网 发布:婚纱摄影选择 知乎 编辑:程序博客网 时间:2024/04/27 22:09

其实对于这个方法我也一知半解,慢慢学吧,剪支法的理论百度一下,具体实现的话主要靠递归

#include<iostream>#include<cstring>#define N 10using namespace std;int n, m, t, end_i, end_j;bool visited[N][N], flag, ans;char map[N][N];int abs(int a, int b){    if (a<b) return b - a;    else return a - b;}void DFS(int i, int j, int c)//运用递归的方法每一步都要进行判断{    if (flag) return;    if (c>t) return;//c代表步数,当走过的步数大于时间t的时候就判断失败了    if (i<0 || i >= n || j<0 || j >= m) { return; }    if (map[i][j] == 'D'&&c == t) { flag = ans = true; return; }    int temp = abs(i - end_i) + abs(j - end_j);    temp = t - temp - c;    if (temp & 1) return;//奇偶剪枝 temp&1是判断奇偶,为偶数的话直接失败了    if (!visited[i - 1][j] && map[i - 1][j] != 'X')    {        visited[i - 1][j] = true;        DFS(i - 1, j, c + 1);        visited[i - 1][j] = false;    }    if (!visited[i + 1][j] && map[i + 1][j] != 'X')    {        visited[i + 1][j] = true;        DFS(i + 1, j, c + 1);        visited[i + 1][j] = false;    }    if (!visited[i][j - 1] && map[i][j - 1] != 'X')    {        visited[i][j - 1] = true;        DFS(i, j - 1, c + 1);        visited[i][j - 1] = false;    }    if (!visited[i][j + 1] && map[i][j + 1] != 'X')    {        visited[i][j + 1] = true;        DFS(i, j + 1, c + 1);        visited[i][j + 1] = false;    }}int main(){    int i, j, x, y, k;//k障碍的个数    while (cin >> m >> n >> t && (m || n || t))    {        memset(visited, false, sizeof(visited));        k = 0;        for (i = 0; i<n; i++)        {            for (j = 0; j<m; j++)            {                cin >> map[i][j];                if (map[i][j] == 'S')                {                    x = i; y = j;                    visited[i][j] = true;                }                if (map[i][j] == 'D')                {                    end_i = i; end_j = j;                }                if (map[i][j] == 'X')k++;            }        }        ans = flag = false;        if (n*m - k - 1 >= t) DFS(x, y, 0);        if (ans) cout << "YES" << endl;        else cout << "NO" << endl;    }    return 0;}
0 0
原创粉丝点击