广度优先搜索BFS

广度优先搜索

一、使用情况

1.寻找最短,最少(目前感觉这个比较多哦)

2.地毯式搜索

二、模板

void  bfs(){

   q.push(start);

while(!q.empty()){

node temp=q.front();

q.pop();

visit(temp)=1;

for(int i=0;i<n;i++)

if(符合条件)q.push();

}

三、落谷总结

1.字串变换

字符串的替换:str.replace(开始位置,要替换的字串长度,目标替换字串);

子串的查找:str.find(查找子串);

注意:在匹配子串进行替换的时候,要匹配完。

代码:#include<iostream>
#include<queue>
#include<map>
#include<string>
using namespace std;
struct node{
    string s;
    int num;    
};
string sa,sb,s1[10],s2[10];
map<string,int> visit;
queue<node> point;
int n=0;
void init(){
    cin>>sa>>sb;
    while(cin>>s1[n]>>s2[n])n++;
    n--;
}
void bfs(){
    node start;
    start.s=sa;
    start.num=0;
    point.push(start);
    while(!point.empty()){
        node  temp=point.front();
        point.pop();
        if(temp.s==sb&&temp.num<11){
            cout<<temp.num <<endl;
            return;
        }
        if(visit[temp.s]==0){
            visit[temp.s]=1;
            for(int i=0;i<=n;i++){
                if(temp.s.find(s1[i])>=0) {
                    for(int j=temp.s.find(s1[i]);j>=0&&j<temp.s.size();j=temp.s.find(s1[i],j+1)){
                        node temp2=temp;
                        temp2.num++;
                        temp2.s.replace(j,s1[i].size(),s2[i]);
                        point.push(temp2);
                    }
                }
            }
        }
        
    }
    cout<<"NO ANSWER!"<<endl;
}
int main(){
    init();
    bfs();
    return 0;
}

2.机器人搬重物:

主要是模拟和方向的处理,要敢写丫!

另外,换方向也是一步。每个节点的四个方向都要 单独标记!

代码:#include<iostream>
#include<queue>
using namespace std;
int n,m;
int a[55][55];
int der[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
int vis[55][55][4];
int sx,sy,ex,ey;
char pos;
struct node{
    int x,y;
    int vac;
    int step;
};
queue<node> q;
bool check(int x,int y){
    if(x<1||x>=n||y<1||y>=m||a[x][y]||a[x+1][y]||a[x][y+1]||a[x+1][y+1])return false;
    return true;
}
int bfs(node start){
    q.push(start);
    while(!q.empty()){
        node temp=q.front() ;
        q.pop();
        if(temp.x ==ex&&temp.y ==ey){
            return temp.step ;
        }
        if(vis[temp.x][temp.y][temp.vac ])continue;
        vis[temp.x][temp.y][temp.vac ]=1;
        node temp1=temp,temp2=temp;
        temp1.step =temp2.step =temp.step +1;
        if(temp.vac ==0){
            temp1.vac =3;
            temp2.vac =2;
        }
        if(temp.vac ==1){
            temp1.vac =2;
            temp2.vac =3;
        }
        if(temp.vac ==2){
            temp1.vac =0;
            temp2.vac =1;
        }
        if(temp.vac ==3){
            temp1.vac =1;
            temp2.vac =0;
        }
        q.push(temp1);
        q.push(temp2);
         for(int i=1;i<=3;i++){
             int tx=temp.x+der[temp.vac ][0]*i,ty=temp.y+der[temp.vac][1]*i;
             if(!check(tx,ty))break;
             node temp3=temp;
             temp3.x =tx;
             temp3.y =ty;
             temp3.step =temp.step +1;
             q.push(temp3);
         }
    }
    return -1;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
        cin>>a[i][j];    
    }
    cin>>sx>>sy>>ex>>ey>>pos;
    node start;
    start.x =sx;
    start.y=sy;
    switch(pos){
        case 'N':{
            start.vac =0;
            break;
        };
        case 'S':{
            start.vac =1;
            break;
        };
        case 'E':{
            start.vac =2;
            break;
        };
        case 'W':{
            start.vac =3;
            break;
        }
    }
    start.step =0;
    cout<<bfs(start)<<endl;
}

posted @ 2019-10-21 19:46  Meursault  阅读(149)  评论(0编辑  收藏  举报