BFS算法题目汇总——刷完这些,搜索类题目不用担心没有思路了

HDU-2717 Catch That Cow

这是BFS最基本的入门模板题目

AC代码:

#include<iostream>
#include<queue>
using namespace std;
const int maxn = 100010;
struct Node
{
    int loc;
    int time;
};
int bfs(int start,int end);
int main()
{
    int n,k;
    while(scanf("%d %d",&n,&k)!=EOF)
        printf("%d
",bfs(n,k));
    return 0;
}
int bfs(int start,int end)
{
    bool visit[maxn]={false};
    queue<Node> q;
    Node top;
    top.loc = start;
    top.time = 0;
    q.push(top);
    while(!q.empty())
    {
        Node temp = q.front();
        q.pop();
        if(temp.loc==end)
            return temp.time;
        for(int i=0;i<3;i++)
        {
            int next = 0;
            if(i==0)
                next = temp.loc+1;
            else if(i==1)
                next = temp.loc-1;
            else if(i==2)
                next = temp.loc*2;
            if(next<0||next>100000||visit[next])
                continue;
            visit[next]=true;
            top.time = temp.time+1;
            top.loc = next;
            q.push(top);
        }
    }
    return -1;
}

做完这道题目,我们来总结一下BFS题目最基本的框架:

while queue 不空:
    cur = queue.pop()
    for 节点 in cur的所有相邻节点:
        if 该节点有效且未访问过:
            queue.push(该节点)

HDU-1372 Knight Moves


#include<iostream>
#include<queue>
using namespace std;
const int maxn = 150;
struct Node
{
    char col;
    int row;
};
int smallestMoves(Node start,Node end);
int main()
{
    Node start,end;
    while(scanf("%c%d %c%d",&start.col,&start.row,&end.col,&end.row)!=EOF)
    {
        int minMoves = smallestMoves(start,end);
        printf("To get from %c%d to %c%d takes %d knight moves.
",start.col,start.row,end.col,end.row,minMoves);
        getchar();
    }
    return 0;
}
int smallestMoves(Node start,Node end)
{
    int st = (start.col-'a'+1)*10+start.row;
    int ed = (end.col-'a'+1)*10+end.row;
    bool visit[maxn] = {false};
    queue<Node> q;
    int moves[maxn]={0};
    q.push(start);
    visit[st] = true;
    int dx[8]={-2,-1,-2,-1,2,1,2,1};
    int dy[8]={-1,-2,1,2,-1,-2,1,2};
    while(!q.empty())
    {
        Node top = q.front();
        q.pop();
        st = (top.col-'a'+1)*10+top.row;
        if(st==ed)
            return moves[st];
        for(int i=0;i<8;i++)
        {
            Node temp;
            temp.col = top.col+dx[i];
            temp.row = top.row+dy[i];
            int tempval = (temp.col-'a'+1)*10+temp.row;
            if(temp.col<'a'||temp.col>'h'||temp.row<1||temp.row>8||visit[tempval])
                continue;
            visit[tempval] = true;
            moves[tempval] = moves[st]+1;
            q.push(temp);
        }
    }
}
原文地址:https://www.cnblogs.com/CuteyThyme/p/12670564.html