2022.3.2#P1605 迷宫——一个简单的DFS

2022-03-02

终于有做题的开心啦哈哈哈哈,可惜第一次提交还是只有90,终点也是路障,这,这真没想到,因为看到起点不是路障就惯性思维了。


 

题目背景

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

题目描述

输入格式

第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。

输出格式

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

输入输出样例

<h1>输入</h1>

2 2 1
1 1 2 2
1 2

<h1>输出</h1>

1


 

题是很基础很典型的DFS应用,注意边界和更新状态值即可,dfs模板的话如下

复制代码
void dfs(a)
{
    if ()
        return;//回溯终止

    di = 1;//更新状态
    dfs(a + 1);
    di = 0;//状态恢复
}
复制代码

我的代码:

复制代码
 1 #include<iostream>
 2 using namespace std;
 3 int n, m, t;
 4 int startt[2], endd[2];
 5 int didian[10][10];
 6 int times;
 7 void dfs(int xx, int yy)
 8 {
 9     if (xx > m || xx<=0 || yy>n || yy <= 0)
10         return;
11     if (xx == endd[0] && yy == endd[1])
12     {
13         times++;
14         return;
15     }
16     if (didian[xx][yy] == 1)
17     {
18         return;
19     }
20     didian[xx][yy] = 1;
21     dfs(xx, yy + 1);
22     dfs(xx, yy - 1);
23     dfs(xx - 1, yy);
24     dfs(xx + 1, yy);
25     didian[xx][yy] = 0;
26 }
27 int main(void)
28 {
29     cin >> n >> m >> t;
30     cin >> startt[0] >> startt[1] >> endd[0] >> endd[1];
31     for (int i = 0;i < t;i++)
32     {
33         int xx, yy;
34         cin >> xx >> yy;
35         if (xx == endd[0] && yy == endd[1])
36         {
37             cout << 0;
38             return 0;
39         }
40         didian[xx][yy] = 1;
41     }
42     dfs(startt[0], startt[1]);
43     cout << times;
44     return 0;
45 }
复制代码

2022.3.2,我要学会弹吉他

posted @   Tiachi  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示