专题一 简单搜索 DFS|BFS

专题地址:https://vjudge.net/contest/65959#overview

  • BFS模板
typedef struct node {
    int x,y;
    int time;
};

int bfs(node s) {
    queue Q;  //创建队列
    node now,next;  //now next结点
    Q.push(s);      //加入开始头节点
    vis[s.x][s.y]=1;    //头节点访问

    while(!Q.empty()) {
        now = Q.front();
        Q.pop();

        for(int i=0; i<4; i++) {
            if(pass(now))   //当前结点满足条件
                return now.time;//返回结点值

            //当前结点不满足条件 宽度搜索
            next.x=now.x+dir[i][0];
            next.y=now.y+dir[i][1];
            next.time=now.time;

            if(check(next)) {   //坐标未越界 未访问过
                next.time+=1;   //路程加一
                vis[next.x][next.y]=1;  //访问加一
                Q.push(next);       //加入队尾
            }
        }
        return -1;
    }

A - 棋盘问题 POJ - 1321

  • 按行向下搜索 简单DFS
#include
#include
#define maxn 20

using namespace std;
char map[maxn][maxn];
int vis[maxn];
int n,k;
int cnt,result;
int dfs(int x) {


    /*
    int dir[4][2] = {(-1,0),(1,0),(0,-1),(0,1)};
    for(int i=0;i<4;i++){
        int nx=dir[i][0]+x;
        int ny=dir[i][1]+y;
    */

    if(x>n)
        return result;
    if(cnt==k) {
        result++;
        return 0;

    }
    for(int i=0; i

B - Dungeon Master POJ - 2251

  • 三层BFS 队列
#include
#include
#include
#define maxn 30+5
using namespace std;

typedef struct pnode {
    int x,y,z;
    int minute;
} pnode ;

char map[maxn][maxn][maxn];
int vis[maxn][maxn][maxn];
int dir[6][3]= {{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
int L,R,C;
pnode sp;
pnode ep;

int check(int x,int y,int z) {
 
        if(x<0 || y<0 || z<0 || x>=L || y>=R || z>=C)
            return -1;
        else if(map[x][y][z] == '#')
            return -1;
        else if(vis[x][y][z])
            return -1;
        return 1;
        
        //写反条件 
    
}
void display(pnode p) {
    cout< Q;
    pnode now,next;
    Q.push(s);
    vis[s.x][s.y][s.z]=1;
    while(!Q.empty()) {
        now = Q.front();
        //cout<>ct;
                    if(ct=='S') {

                        sp.x=i;
                        sp.y=j;
                        sp.z=k;
                        sp.minute=0;
                    }
                    if(ct=='E') {

                        ep.x=i;
                        ep.y=j;
                        ep.z=k;
                        ep.minute=0;
                    }
                    map[i][j][k] = ct;
                }

        int result = bfs(sp);
        if(result==-1)
            cout<<"Trapped!"<

C - Catch That Cow POJ - 3278

  • 一维数组 三方向BFS
#include
#include
#include
#define maxn 100000+5

using namespace std;
int N,K;
int map[maxn];
int vis[maxn];
typedef struct node {
    int time;
    int x;
} node;

int walkThisTime;
int mintime = 0xFFFFFF;

int jump(int x,int choice) {
    if(choice==0)
        return x+1;
    if(choice==1)
        return x-1; 
    if(choice==2)
        return 2*x;
    
}

int check(int x) {
    if(x<0||x>maxn)
        return -1;
    else if(vis[x]==1)
        return -1;
    else
        return 1;
}

//三方向bfs
int bfs(node s) {
    queue Q;
    node now,next;
    Q.push(s);
    vis[s.x]=1;
    
    while(!Q.empty()) {
        now = Q.front();
        Q.pop();

        for(int i=0; i<3; i++) {
            int walkThisTime = jump(now.x,i);
            next.x = now.x;
            next.time = now.time;
            /* 
            cout<<"当前坐标"<=K) {
        cout<

你可能感兴趣的:(专题一 简单搜索 DFS|BFS)