DFS每日刷题
目录
P1605 迷宫
P1451 求细胞数量
P1219 [USACO1.5] 八皇后 Checker Challenge
P1605 迷宫
#include <iostream>
using namespace std;
int n, m, t;
int a[20][20];
int startx, starty, endx, endy;
bool vis[20][20];
int res;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
void dfs(int x, int y)
{if (x == endx && y == endy){res++;return;}for (int i = 0; i < 4; i++){int nx = x + dx[i];int ny = y + dy[i];if (nx >= 1 && ny >= 1 && nx <= n && ny <= m && !vis[nx][ny] && a[nx][ny] != 1){vis[nx][ny] = true;dfs(nx, ny);vis[nx][ny] = false;}}
}
int main()
{cin >> n >> m >> t;cin >> startx >> starty >> endx >> endy;int c, b;a[startx][starty] = 1;for (int i = 1; i <= t; i++){cin >> c >> b;a[c][b] = 1;}dfs(startx, starty);cout << res;return 0;
}
P1451 求细胞数量
#include <iostream>
using namespace std;
int n, m;char s[105][105];
bool vis[105][105];
int dx[] = {0, 0, 1, -1};
int dy[] = {-1, 1, 0, 0};
void dfs(int x, int y, int res)
{vis[x][y] = true;for (int i = 0; i < 4; i++){int nx = x + dx[i];int ny = y + dy[i];if (nx >= 1 && ny >= 1 && nx <= n && ny <= m && !vis[nx][ny] && s[nx][ny] != '0'){vis[nx][ny] = true;dfs(nx, ny, res);}}
}
int main()
{cin >> n >> m;int res = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> s[i][j];}}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (s[i][j] != '0' && !vis[i][j]){dfs(i, j, ++res);}}}cout << res;return 0;
}
P1219 [USACO1.5] 八皇后 Checker Challenge
#include <iostream>
using namespace std;
int n;
bool vish[20];
bool visy[50];
bool visz[50];
int a[20];
int res;
void dfs(int x)
{if (x > n){if (res < 3){for (int i = 1; i <= n; i++){cout << a[i] << " ";}cout << endl;}res++;return;}for (int i = 1; i <= n; i++){if (!vish[i] && !visz[x + i] && !visy[x - i + 1]){visz[x + i] = true;visy[x - i + 1] = true;vish[i] = true;a[x] = i;dfs(x + 1);vish[i] = false;visz[x + i] = false;visy[x - i + 1] = false;a[x] = 0;}}
}
int main()
{cin >> n;dfs(1);cout << res;return 0;
}
如何表示斜行: