2.24DFS和BFS刷题
洛谷P2895:用BFS走出危险区域,危险区域存在时间,我们用ma记录最快变成危险区域的时间, 然后每次枚举时间+1然后跟ma数组比较看能不能走,然后时间复杂度为O(305^2)。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 50010;
int m, x, y, t;
typedef pair<int, int>PII;
int ma[305][305], ans[305][305];
bool v[305][305];
int dx[5] = {1, -1, 0, 0, 0},dy[5] = {0, 0, 1, -1, 0};
int change(int x){
if(x == -1)return 99999;
return x;
}
int main(){
cin >> m;
memset(ma, -1, sizeof(ma));
while(m--){
cin >> x >> y >> t;
for(int i = 0; i < 5; i++){
if(x + dx[i] >= 0 && y + dy[i] >= 0 && (ma[x + dx[i]][y + dy[i]] == -1 || ma[x + dx[i]][y + dy[i]] > t)){
ma[x + dx[i]][y + dy[i]] = t;
}
}
}
queue<PII> q;
q.push({0, 0});
v[0][0] = true;
while(q.size()){
auto t = q.front();
q.pop();
int xd = t.first, yd = t.second;
int s = ans[xd][yd] + 1;
if(ma[xd][yd] == -1){
cout << s - 1 << endl;
return 0;
}
for(int i = 0; i < 4; i++){
int xx = xd + dx[i], yy = yd + dy[i];
if(xx >= 0 && yy >= 0 && s < change(ma[xx][yy]) && !v[xx][yy]){
v[xx][yy] = true;
ans[xx][yy] = s;
q.push({xx, yy});
}
}
}
cout << -1 << endl;
return 0;
}
洛谷P2036
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int n, ss = 1, bb;
int s[15], b[15];
bool flag[15];
int ans = 0x7ffffff;
void dfs(int x){
if(x > n){
}
else{
for(int i = 1; i <= n; i++){
if(flag[i] == false){
ss *= s[i], bb += b[i];
flag[i] = true;
ans = min(ans, abs(ss - bb));
dfs(x + 1);
ss /= s[i], bb -= b[i];
flag[i] = false;
}
}
}
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> s[i] >> b[i];
}
dfs(1);
cout << ans << endl;
return 0;
}
洛谷P1605迷宫
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n, m, t;
const int N = 15;
int sx, sy, fx, fy, xd, yd;
bool za[N][N], st[N][N];
int ans;
int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0};
void dfs(int x, int y){
if(x == fx && y == fy){
ans++;
return;
}
for(int i = 0; i < 4; i++){
int xx = x + dx[i], yy = y + dy[i];
if(xx >= 1 && xx <= n && yy >= 1 && yy <= m && !za[xx][yy] && !st[xx][yy]){
st[xx][yy] = true;
dfs(xx, yy);
st[xx][yy] = false;
}
}
}
int main(){
cin >> n >> m >> t;
cin >> sx >> sy >> fx >> fy;
st[sx][sy] = true;//注意特殊点
while(t--){
cin >> xd >> yd;
za[xd][yd] = true;
}
dfs(sx, sy);
cout << ans << endl;
return 0;
}