码迷,mamicode.com
首页 > 其他好文 > 详细

深度优先探索与广度优先探索

时间:2018-09-30 23:21:34      阅读:336      评论:0      收藏:0      [点我收藏+]

标签:include   sizeof   push   注意   set   memset   pop   containe   std   

遍历所有状态最好用dfs,求最短路用bfs,(无权值,都是一);
要注意满足状态与越界状态。(必要时设标志位)
 
dfs
bool judge(){
    int k = 0, p = 0, q = 0;
for(int i = 0; i < n; i++){
    if(b[i] == true) k++;
}
for(int i = 0; i < n; i++){
    if(b[i] == true) {
    p = a[i];
    break;
    }
}
for(int i = n - 1; i >= 0; i--){
    if(b[i] == true) {
    q = a[i];
    break;
    }
}
return k >= 2 && q - p >= x;
}
void dfs(int i, int sum, int minn, int maxx, int ppp){
if(i == n){
    if(maxx - minn >= x && ppp >= 2 && sum >= l && sum <= r){
        num++;
    }
    return;
}
b[i] = false;
dfs(i + 1, sum, minn, maxx, ppp);
b[i] = true;
dfs(i + 1, sum + a[i], min(minn, a[i]), max(maxx, a[i]), ++ppp);
}
 
 

 
 
void dfs(int i, int sum){ 
    if(i == n){ 
        if(judge() && sum >= l && sum <= r){
            num++;
        } return; 
    } 
    b[i] = false; 
    dfs(i + 1, sum); 
    b[i] = true; 
    dfs(i + 1, sum + a[i]);
}
 
 
这种可以统计数量
不统计数量的,因为有一个成立就全部返回了。
 
bool dfs(int i, int sum){
if(i == n){
    if(judge() && sum >= l && sum <= r){
        num++;
        return true;
    }
    return false;
}
b[i] = false;
if(dfs(i + 1, sum)) {
    return true;
}
b[i] = true;
if(dfs(i + 1, sum + a[i])){
    return true;
}
return false;
}
 
这个是八皇后问题,记一个标志位。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 8;
int cnt;
int board[15][15];
bool check(int x, int y) {
?
    for(int i = 0; i < x; i++) {
?
   if(board[i][y]) return false;
?
   }
?
    for(int i = 0; i < x; i++) {
?
        if(y - x + i < 0) continue;
?
        if(board[i][y - x + i]) return false;
?
    }
?
    for(int i = 0; i < x; i++) {
?
        if(y + x - i >= 8) continue;
?
        if(board[i][y + x - i]) return false;
?
    }
?
    return true;
?
}
?
?
?
void dfs(int x, int y) {
?
    if(x == 7) {
?
        cnt++;
?
        printf("No. %d\n", cnt);
?
        for(int i = 0; i < 8; i++) {
?
            for(int j = 0; j < 8; j++) {
?
                printf("%d ", board[i][j]);
?
            }
?
            printf("\n");
?
        }
?
        return;
?
    }
?
?
?
    for(int i = 7; i >= 0; i--) {
?
        board[x + 1][i] = 1;
?
        if(check(x + 1, i)) dfs(x + 1, i);
board[x + 1][i] = 0;
}
}
int main() {
?
    cnt = 0;
?
    memset(board, 0, sizeof(board));
?
    for(int i = 0; i < 8; i++) {
?
        board[0][i] = 1;
?
        dfs(0, i);
?
        board[0][i] = 0;
?
    }
?
}
 
下面是bfs;

const int INF = 1e8;
typedef pair<int, int> P;
char maze[MAX][MAX];
int N, M;
int sx, sy;
int gx, gy;
int d[MAX][MAX];
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
int dfs(){
queue<P> que;
for(int i = 0; i < N; i++){
    for(int j = 0; j < M; j++){
        d[i][j] = INF;
        que.push(P(sx, sy));
        d[sx][sy] = 0;
    while(que.size()){
        P p = que.front(); 
        que.pop();
        if(p.first == gx && p.second == gy) break;
        for(int i = 0; i < 4; i++){
            int nx = p.first + dx[i], ny = p.second + dy[i];
            if(nx >= 0 && nx < N && ny >= 0 && ny < M && maze[nx][ny] != ‘#‘ && d[nx][ny] == INF){
                que.push(P(nx, ny));
                d[nx][ny] = d[p.first][p.second] + 1;
            }
        }
    }
    return d[gx][gy];
}
void solve(){
int res = bfs();
}
}

深度优先探索与广度优先探索

标签:include   sizeof   push   注意   set   memset   pop   containe   std   

原文地址:https://www.cnblogs.com/downrainsun/p/9733644.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!