dfs如何剪枝?蒟蒻求求
#include <bits/stdc++.h>
using namespace std;
const int N = 1000 + 10;
char a[N][N];
bool vis[N][N];
int minn = 0x3f3f3f3f;
int d, r;
int h, w;
bool used = false;
const int dx[4] = {-1, 0, 0, 1};
const int dy[4] = {0, -1, 1, 0};
void dfs(int x, int y, int tmp)
{
if (x >= h && y >= w)
{
minn = min (tmp, minn);
return;
}
if (used == false)
{
int nx = x + d, ny = y + r;
if (a[nx][ny] != '#' && a[nx][ny] == '.' && vis[nx][ny] == 0 && nx >= 1 && nx <= h && ny >= 1 && ny <= w)
{
vis[nx][ny] = 1;
used = true;
dfs (x + d, y + r, ++ tmp);
vis[nx][ny] = 0;
tmp --;
used = false;
}
}
for (int i = 0; i < 4; i ++)
{
int nx = x + dx[i], ny = y + dy[i];
if (a[nx][ny] != '#' && a[nx][ny] == '.' && vis[nx][ny] == 0 && nx >= 1 && nx <= h && ny >= 1 && ny <= w)
{
vis[nx][ny] = 1;
dfs (nx, ny, ++ tmp);
vis[nx][ny] = 0;
tmp --;
}
}
}
int main()
{
memset (vis, 0, sizeof vis);
cin >> h >> w >> d >> r;
for (int i = 1; i <= h; i ++)
for (int j = 1; j <= w; j ++)
cin >> a[i][j];
dfs(1, 1, 0);
if (minn == 0x3f3f3f3f) cout << -1;
else cout << minn;
return 0;
}