洛谷P1363_迷宫dfs搜索的船新版本

以前用迷宫dfs搜索的形参都是m(m = row * 列数 + col),然后依次搜索

*****************************弱************蒟蒻****************************************

船新版本:

(1)形参就是行号和列号

(2)vis[x][y][0]记录该点的访问值的row,vis[x][y][1]记录该点访问值的col,初始化INF

(3)算得modn的行号tx和modm的列号ty

(4)如果该点不能走则返回0

(5)如果该点能走,但访问值不为初始值INF,即已经走过了

    若该点的访问值为x和y,那么返回0

    若该点的访问值不为x和y,那么则认为到达了无穷远,返回1

(6)否则记录访问值,继续从4个方向扩展

*********************************************************************************************

//dfs搜迷宫船新版本
#include <cstdio>

using namespace std;

const int maxn = 2000;
const int INF = 99999999;

int n, m, S;
int vis[maxn][maxn][2];
int a[maxn][maxn];
char str[maxn];
int dx[4]={-1, 1, 0, 0};
int dy[4]={0, 0, -1, 1};

bool dfs(int x, int y)
{//如果一个位置的访问值不等于当前x和y的值则到达无穷大
    int tx = (x % n + n) % n;
    int ty = (y % m + m) % m;
    if(a[tx][ty]) return 0;
    if(vis[tx][ty][0] != INF)
        return vis[tx][ty][0]!=x || vis[tx][ty][1]!=y;
    vis[tx][ty][0] = x;//访问值记录
    vis[tx][ty][1] = y;
    for(int i = 0; i < 4; ++i)
        if(dfs(x+dx[i], y+dy[i]))
            return 1;
    return 0;
}

int main()
{
    while(~scanf("%d %d", &n, &m))
    {
        int i, j, sx, sy;
        for(i = 0; i < n; ++i)
        {
            scanf("%s", str);
            for(j = 0; j < m; ++j)
            {
                vis[i][j][0] = INF;//初始值
                if(str[j] == 'S')
                {
                    a[i][j] = 0;
                    sx = i;
                    sy = j;
                }
                else if(str[j] == '#') a[i][j] = 1;
                else a[i][j] = 0;
            }
        }
        if(dfs(sx, sy)) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jay__bryant/article/details/80256986
今日推荐