大佬们,dfs如何剪枝?
查看原帖
大佬们,dfs如何剪枝?
818852
Angxle楼主2022/10/23 16:20

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;
}
2022/10/23 16:20
加载中...