Skip to content

算法刷题【洛谷P1605】迷宫

信息学竞赛

2022-04-17

题目描述

给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

输入格式

第一行N、M和T,N为行,M为列,T为障碍总数。

第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。

输出格式

给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。

输入输出样例

In 1:

2 2 1
1 1 2 2
1 2

Out 1:

1

数据范围

1≤N,M≤5

题解

就是这样

一道比较简单的深搜可以解决的问题

和这位ybb756032937的差不多

注意那行注释!

虽然通常把锁放在if里面

但是锁是拿来锁当前这一步的状态的

所以if里面的话要锁的要也是p q

对于全排列for和if是为当前这一步找匹配的没用到的值,锁也是锁当前这一步

和这个不完全一样,注意别踩坑

#include <iostream>
using namespace std;

int n, m, t, sx, sy, fx, fy, a[11][11], lo[11][11], ans;
int mv[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

void dfs(int p, int q)
{
    if (p == fx && q == fy)
    {
        ans++;
        return;
    }
    int x, y;
    lo[p][q] = 1;//
    for (int i = 0; i < 4; i++)
    {
        x = p + mv[i][0];
        y = q + mv[i][1];
        if (a[x][y] && !lo[x][y])
        {
            dfs(x, y);
        }
    }
    lo[p][q] = 0;
}

int main()
{
    cin >> n >> m >> t >> sx >> sy >> fx >> fy;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            a[i][j] = 1;
        }
    }
    int a1, a2;
    while (t--)
    {
        cin >> a1 >> a2;
        a[a1][a2] = 0;
    }
    dfs(sx, sy);
    cout << ans << endl;
    return 0;
}

Ukraine 在俄罗斯对乌克兰发动的野蛮的侵略战争中矢志不渝地支持乌克兰