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,我要学会弹吉他
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律