求调爆搜,连样例都没过
查看原帖
求调爆搜,连样例都没过
363006
wangyibo201026楼主2022/4/22 16:08
#include<bits/stdc++.h>

#define int long long
#define end '\n'
#define rep(i, s, t) for(int i = (s); i <= (t); i++)

using namespace std;

const int N = 35;

int n, m;
char a[N][N];

int f, sx, sy, mini = 1e9;
bool vis[N][N];

void dfs(int x, int y, int f, int sum){
	if(x < 1 || x > n || y < 1 || y > m || vis[x][y] || a[x][y] == '.'){
		return ;
	}
	vis[x][y] = true;
	if(a[x][y] == 'F'){
		mini = min(mini, sum);
		return ;
	}
	if(f == 1){
		if(a[x][y + 1] == '.' && a[x - 1][y] == '.' && a[x + 1][y] == '.'){
			dfs(x, y - 1, 2, sum + 10);
		}
	}
	if(f == 2){
		if(a[x][y - 1] == '.' && a[x + 1][y] == '.' && a[x - 1][y] == '.'){
			dfs(x, y + 1, 1, sum + 10);
		}
	}
	if(f == 3){
		if(a[x - 1][y] == '.' && a[x][y - 1] == '.' && a[x][y + 1] == '.'){
			dfs(x + 1, y, 4, sum + 10);
		}
	}
	if(f == 4){
		if(a[x + 1][y] == '.' && a[x][y + 1] == '.' && a[x][y - 1] == '.'){
			dfs(x - 1, y, 3, sum + 10);
		}
	}
	if(f == 1){
		dfs(x, y + 1, f, sum);
	}
	else if(f == 2){
		dfs(x, y - 1, f, sum);
	}
	else if(f == 3){
		dfs(x - 1, y, f, sum);
	}
	else if(f == 4){
		dfs(x + 1, y, f, sum);
	}
	if(f == 1){
		dfs(x - 1, y, 3, sum + 1);
	}
	else if(f == 2){
		dfs(x + 1, y, 4, sum + 1);
	}
	else if(f == 3){
		dfs(x, y - 1, 2, sum + 1);
	}
	else if(f == 4){
		dfs(x, y + 1, 1, sum + 1);
	}
	if(f == 1){
		dfs(x + 1, y, 4, sum + 5);
	}
	else if(f == 2){
		dfs(x - 1, y, 3, sum + 5);
	}
	else if(f == 3){
		dfs(x, y + 1, 1, sum + 5);
	}
	else if(f == 4){
		dfs(x, y - 1, 2, sum + 5);
	}
	vis[x][y] = false;
}

void Solve(){
	cin >> n >> m;
	rep(i, 1, n){
		rep(j, 1, m){
			cin >> a[i][j];
			if(a[i][j] != '.' && a[i][j] != '#' && a[i][j] != 'F'){
				f = (a[i][j] == 'E' ? 1 : (a[i][j] == 'W' ? 2 : (a[i][j] == 'N' ? 3 : 4)));
				sx = i, sy = j;
			}
		}
	}
	dfs(sx, sy, f, 0);
	cout << mini - 2 << endl;
}

signed main(){
  Solve();
  return 0;
}
2022/4/22 16:08
加载中...