搜索--P1605 迷宫
题目背景
迷宫 【问题描述】
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和
终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫
中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
输入样例 输出样例
【数据规模】
1≤N,M≤5
题目描述
输入输出格式
输入格式:
【输入】
第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点
坐标FX,FY。接下来T行,每行为障碍点的坐标。
输出格式:
【输出】
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方
案总数。
AC代码1
首先判断下一步是否可以走,可以走则进行递归,并标记已选(即标记下一步),递归结束后还原标记。这个思路有坑的地方在于开始位置已经选择不可以再次递归,但是一开始容易忽略。其次,棋盘的定义也是花了我不少时间,因为输入n*m是行和列,所以行最小是1,数组的最大值应为n+1,对应的m也一样
#include<cstdio>
#include<cmath>
using namespace std;
int row1, row2, barrier;
int startx, starty, endx, endy;
int area[6][6] = {0};
int ans = 0;
void dfs(int x = startx, int y = starty) {
if (x == endx && y == endy) {
ans++;
return;
}
//往上走
if (y < row2 && area[x][y + 1] != 1) {
area[x][y + 1] = 1;
dfs(x, y + 1);
area[x][y + 1] = 0;
}
//往下走
if (y > 1&& area[x][y - 1] != 1) {
area[x][y - 1] = 1;
dfs(x, y - 1);
area[x][y - 1] = 0;
}
//往右走
if (x < row1&& area[x+1][y] != 1) {
area[x+1][y] = 1;
dfs(x + 1, y);
area[x+1][y] = 0;
}
//往左走
if (x > 1 && area[x-1][y] != 1) {
area[x-1][y] = 1;
dfs(x - 1, y);
area[x-1][y] = 0;
}
}
int main() {
scanf("%d%d%d", &row1, &row2, &barrier);
scanf("%d%d%d%d", &startx, &starty, &endx, &endy);
while (barrier > 0) {
int x, y;
scanf("%d%d", &x, &y);
area[x][y] = 1;
barrier--;
}
area[startx][starty] = 1;
dfs();
printf("%d", ans);
return 0;
}
优化
1 在四个方向上递归如果简单写的话,可以利用int xs[4] = {-1, 1, 0, 0};
的方式。可有可无
2 下面这种解法从当前位置开始标记,结束条件是数组越界(索引大于行数和列数)或者访问到结束的结点
#include<cstdio>
#include<cmath>
using namespace std;
int row1, row2, barrier;
int startx, starty, endx, endy;
int area[6][6] = {0};
int ans = 0;
int xs[4] = {-1, 1, 0, 0};
int ys[4] = {0, 0, -1, 1};
void dfs(int x = startx, int y = starty) {
if (y < 1 || y > row2 || x < 1 || x > row1)
return;
if (x == endx && y == endy) {
ans++;
return;
}
area[x][y] = 1;
for (int i = 0; i < 4; ++i) {
if (area[x + xs[i]][y + ys[i]] != 1) {
dfs(x+xs[i], y + ys[i]);
}
}
area[x][y] = 0;
}
int main() {
// freopen("E:/下载/testdata (4).in","r",stdin);
scanf("%d%d%d", &row1, &row2, &barrier);
scanf("%d%d%d%d", &startx, &starty, &endx, &endy);
while (barrier > 0) {
int x, y;
scanf("%d%d", &x, &y);
area[x][y] = 1;
barrier--;
}
dfs();
printf("%d", ans);
return 0;
}
搜索--P1605 迷宫的更多相关文章
- 洛谷 P1605 迷宫
题目链接 https://www.luogu.org/problemnew/show/P1605 题目背景 迷宫 题目描述 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 ...
- P1605 迷宫
P1605 迷宫 这是一道毒瘤题... 这是一道广搜题 bfs ... 代码: #include<cstdio> #include<iostream> #include< ...
- 洛谷—— P1605 迷宫
P1605 迷宫 题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在 ...
- 【搜索1】P1605 迷宫
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- 洛谷P1605 迷宫 深度搜索 模板!
题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右四种方式,每次只能移 ...
- (DFS)P1605 迷宫 洛谷
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- 广度优先搜索--POJ迷宫问题
Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...
- P1605 迷宫(洛谷)
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右 ...
- P1605迷宫
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
随机推荐
- USACO Section 1.1PROB Your Ride Is Here
题目传送门 不能提交哦 http://www.nocow.cn/index.php/Translate:USACO/ride /* ID: jusonal1 PROG: ride LANG: C+ ...
- Oracle高水位线
Oracle高水位线 https://blog.csdn.net/jx_jy/article/details/50607790 Oracle高水位线的概念 Oracle里面的对象放到存储级别都称为se ...
- python-----重命名文件(在原文件名前加0)
问题描述: 如果用循环给文件命名,则文件名就会是1,2,3...,10,11,12,13...,100,101...,但是遍历这些文件时,顺序就会变成1,10,100,101,...109,11,.. ...
- sql让时间调前,调后的语句
时间调前,调后 select billid,DATEADD(mm,2,billdate) from bi_Bill 注:用dateadd(/时间年/月/日,调前或后多少,字段) mm为月份,2为调前两 ...
- HTML5中File
一 File对象与FileList对象 当将input元素的type类型设置为file时,web页面上会显示一个选择文本按钮和一个文本显示框,单击文件按钮可以选择一个文件,文本显示框中会显示选中的文件 ...
- visual studio使用dos命令在生成项目时复制文件到指定目录
本人使用软件:vs2015 拷贝“项目1”的 bin目录 下, 项目配置的名称(“Release”,“Debug”)目录下,所有内容到“项目2”输出目录(存在直接覆盖): xcopy $(Soluti ...
- bzoj 1621: [Usaco2008 Open]Roads Around The Farm分岔路口【dfs】
模拟就行--讲道理这个时间复杂度为啥是对的??? #include<iostream> #include<cstdio> using namespace std; int k, ...
- easyui-datebox 年月视图显示
//年月视图做法 $('#startYearDate').datebox({ onShowPanel: function () { //显示日趋选择对象后再触发弹出月份层的事件,初始化时没有生成月份层 ...
- QuartzJobs 如何发布服务
http://www.cnblogs.com/jys509/p/4614975.html http://www.cnblogs.com/lc-chenlong/p/3948760.html 安装:To ...
- 浅谈算法——splay
BST(二叉查找树)是个有意思的东西,种类巨TM多,然后我们今天不讲其他的,我们今天就讲splay 首先,如果你不知道Splay是啥,你也得知道BST是啥 如上图就是一棵优美的BST,它对于每个点保证 ...