BFS & DFS
棋盘问题(DFS)
#include <iostream>
#include <cstdio>
#include <cstring>
#define Max 10
using namespace std;
int n, k, cnt, way;
char maze[Max][Max];
int vis[Max];
void dfs(int row) {
if(way == k) {
cnt++;
return;
}
if(row >= n) return;
for(int i=0; i<n; i++) {
if(maze[row][i] == '#' && vis[i] == 0) {
vis[i] = 1;
way++;
dfs(row+1);
way--;
vis[i] = 0;
}
}
dfs(row+1);
}
int main(int argc, const char * argv[]) {
while(scanf("%d%d", &n, &k) && n!=-1 && k!=-1) {
getchar();
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
scanf("%c", &maze[i][j]);
}
getchar();
}
cnt = 0;
way = 0;
memset(vis, 0, sizeof(vis));
dfs(0);
cout<<cnt<<endl;
}
return 0;
}
马走日(DFS)
马走日
#include <iostream>
#include <cstdio>
#include <cstring>
#define Max 1005
using namespace std;
int step[8][2] = {{1,2}, {1,-2}, {-1,2}, {-1,-2}, {-2,1}, {2,1}, {-2,-1}, {2,-1}};
int n, m;
int cnt;
int start_x, start_y;
int visited[Max][Max];
void dfs(int way, int x, int y) {
if(way == n*m) {
cnt++;
return;
}
for(int i=0; i<8; i++) {
int next_x = x + step[i][0];
int next_y = y + step[i][1];
if(visited[next_x][next_y] == 0 && next_x>=0 && next_y>=0 && next_x<n && next_y<m) {
visited[next_x][next_y] = 1;
dfs(way+1, next_x, next_y);
visited[next_x][next_y] = 0;
}
}
}
int main(int argc, const char * argv[]) {
scanf("%d%d%d%d", &n, &m, &start_x, &start_y);
memset(visited, 0, sizeof(visited));
visited[start_x][start_y] = 1;
cnt = 0;
dfs(1, start_x, start_y);
cout<<cnt<<endl;
return 0;
}
仙岛求药(BFS)
仙岛求药
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define Max 100
using namespace std;
char maze[Max][Max];
typedef pair<int, int> P;
int start_x, start_y, end_x, end_y;
int d[4][2] = {{0,1}, {0,-1}, {1,0}, {-1,0}};
int dis[Max][Max];
int bfs(int n, int m) {
queue<P> que;
que.push(P(start_x, start_y));
dis[start_x][start_y] = 0;
while(!que.empty()) {
P p = que.front();
que.pop();
if(p.first == end_x && p.second == end_y) break;
for(int i=0; i<4; i++) {
int x = p.first + d[i][0];
int y = p.second + d[i][1];
if(x<n && x>=0 && y<m && y>=0 && maze[x][y] != '#' && dis[x][y] == -1) {
que.push(P(x, y));
dis[x][y] = dis[p.first][p.second] + 1;
}
}
}
return dis[end_x][end_y];
}
int main(int argc, const char * argv[]) {
int n, m;
while(scanf("%d%d", &m, &n) && n!=0 && m!=0) {
getchar();
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
scanf("%c", &maze[i][j]);
if(maze[i][j] == '@') {start_x = i; start_y = j;}
else if(maze[i][j] == '*') {end_x = i; end_y = j;}
}
getchar();
}
memset(dis, -1, sizeof(dis));
int result = bfs(m, n);
cout<<result<<endl;
}
return 0;
}
butterfly(BFS)
butterfly
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define Max 100005
using namespace std;
struct edge {
int u, v, type;
int next;
}edges[Max];
int visited[Max];
int head[Max];
int type[Max];
int total = 0;
void bfs(int s) {
queue<int> que;
que.push(s);
visited[s] = 1;
type[s] = 0;
while(!que.empty()) {
int u = que.front();
que.pop();
for(int i=head[u]; i!=-1; i=edges[i].next) {
int v = edges[i].v;
if(visited[v] == 0) {
visited[v] = 1;
que.push(v);
if(edges[i].type == 0) {
type[v] = type[u];
}
else type[v] = type[u]^1;
}
}
}
}
void addedge(int u, int v, int type) {
edges[total].u = u;
edges[total].v = v;
edges[total].type = type;
edges[total].next = head[u];
head[u] = total++;
}
int main(int argc, const char * argv[]) {
int n, m;
while(cin>>n>>m) {
int s;
total = 0;
memset(visited, 0, sizeof(visited));
memset(head, -1, sizeof(head));
for(int i=0; i<m; i++) {
int u, v, type;
scanf("%d%d%d", &u, &v, &type);
addedge(u, v, type);
if(i==0) s = u;
}
bfs(s);
int i;
for(i=0; i<m; i++) {
int u = edges[i].u, v = edges[i].v;
if(edges[i].type == 0 && type[u] != type[v]) {
cout<<"NO"<<endl;
break;
}
else if(edges[i].type == 1 && type[u] == type[v]) {
cout<<"NO"<<endl;
break;
}
}
if(i == m) {
cout<<"YES"<<endl;
}
}
return 0;
}