0
已解决
王子健
初级天翼
初级天翼
3706 走迷宫 经验值:1600
题目描述 Description
在一个m*n的迷宫中,布满了重重陷阱。迷宫里有陷阱的房间是不能踏足的,在任意一个不是陷阱的房间可以朝周围的8个方向的没有陷阱的房间继续探索。现在给出起点坐标(a,b)和终点坐标(x,y),试判断能否从起点到达终点。
输入描述 Input Description
第一行,两个由空格隔开的整数,m n
第二行,四个由空格隔开的整数,a b x y
接下来m行,每行n个整数,为0或1,0表示不是陷阱,1表示陷阱
输出描述 Output Description
如果能到达终点输出最少需要的步数;否则输出-1
样例输入 Sample Input
2 2 1 1 2 2 0 1 1 0
样例输出 Sample Output
1
数据范围及提示 Data Size & Hint
2 ≤ m,n ≤ 20
(1,1)->(2,2),共1步
错误代码,TLE+WA:
#include <iostream>
using namespace std;
int map[25][25];
int vis[25][25];
int dir[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}};//上,右上,右,右下,下,左下,左,左上
int cnt, n, m, sx, sy, fx, fy;
void dfs(int x, int y) {
if (x==fx && y==fy) {
cnt ++;
return ;
}
for (int i=0; i<8; i++) {
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (map[nx][ny] == 0 && nx>=1 && nx<=m && ny>=1 && ny<=n && vis[nx][ny] == 0) {
vis[nx][ny] = 1;
dfs(nx, ny);
vis[nx][ny] = 0;
}
}
}
int main() {
cin >> m >> n >> sx >> sy >> fx >> fy;
for (int i=1; i<=m; i++)
for (int j=1; j<=n; j++)
cin >> map[i][j];
vis[sx][sy] = 1;
dfs(sx, sy);
if(cnt == 0) cout << -1;
else cout << cnt;
return 0;
}
望大佬找错,谢谢
王子健在2020-08-18 10:46:00追加了内容
采纳加50豆,望求解
王子健在2020-08-25 07:57:19追加了内容
最近问问题怎么总是没人回答??算了,还是老规矩,作诗:
赵逸凡他长得帅,刷题那叫一个快!为了coding献了身,_ _ _ _ _
王子健在2020-08-25 08:06:03追加了内容
送豆子
王子健在2020-08-25 12:51:51追加了内容
送豆子也没人要?
0
1
0
0
0
0
0
0
0
0