算法设计课程复习(7)-BFS & DFS

BFS & DFS

棋盘问题(DFS)
#include <iostream>
#include <cstdio>
#include <cstring>
#define Max 10
using namespace std;
int n, k, cnt, way; //  cnt表示方案数,way表示这一个方案p放了多少颗棋子
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[]) {
    // insert code here...
    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++;
        //cout<<cnt<<endl;
        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[]) {
    // insert code here...
    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[]) {
    // insert code here...
    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[]) {
    // insert code here...
    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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值