一道画风惊奇搜(yue)索(du)题...
这题其实不难...就是需要点阅读水准避开几个坑点
1、注意要撞裂障碍物一定要具有一个冲量
即:搜索到1格子时,一定保证自己至少是从一个0滑过来的.
2、搜索的边界条件:step > 10 就进行剪枝
超过10步直接puts("-1");
3、说白了就是从起点2跑到终点3 一遍dfs+剪枝可过...
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int dx[5] = {0, 1, 0, -1, 0};
const int dy[5] = {0, 0, 1, 0, -1};
int m, n, stx, sty, edx, edy;
int map[30][30], ans;
void dfs(int x, int y, int step) {
if(step > 10) return;
for(int i = 1; i <= 4; ++i) {
int xx = x + dx[i], yy = y + dy[i];
int mx = x, my = y;
while(xx > 0 && yy > 0 && xx <= m && yy <= n && map[xx][yy] != 1) {
mx += dx[i]; my += dy[i];
if(mx == edx && my == edy) {
ans = min(step, ans);
return;
}
xx = mx + dx[i]; yy = my + dy[i];
if(xx < 1 || yy < 1 || xx > m || yy > n) break;
if(map[xx][yy] == 1) {
map[xx][yy] = 0;
dfs(mx, my, step + 1);
map[xx][yy] = 1;
}
}
}
}
int main() {
while(scanf("%d%d", &n, &m) && (n || m)) {
for(int i = 1; i <= m; ++i) for(int j = 1; j <= n; ++j) {
scanf("%d", &map[i][j]);
if(map[i][j] == 2) stx = i, sty = j;
if(map[i][j] == 3) edx = i, edy = j;
}
ans = 0x3f3f3f3f;
dfs(stx, sty, 1);
if(ans == 0x3f3f3f3f) puts("-1");
else printf("%d\n", ans);
}
return 0;
}