双向BFS

1034 Number Game
分数 35
作者 陈越
单位 浙江大学
A number game is to start from a given number A, and to reach the destination number B by a sequence of operations.

For the current number X, there are 3 types of operations:

X=X+1
X=X−1
X=X×N
Your job is to find the minimum number of steps required to reach B from A.

Input Specification:
Each input file contains several test cases. The first line gives a positive integer K (≤10) which is the total number of cases. For each case, three integers are given: A, B and N, where −10
5
≤A,B≤10
5
and 1<N<10. All the numbers in a line are separated by a space.

Output Specification:
For each test case, print in a line the minimum number of steps required to reach B from
创建两个队列和两个哈希表

queue<string> que1;
queue<string> que2;
unordered_map da<string,int> da1;
unordered_map db <string,int> db2;

(25)分 双向bfs
还能怎么优化呢? 请赐教

#include <bits/stdc++.h>
using namespace std;
const int K = 20;
int k;

int extend(queue<int>& que,int N,map<int,int>& set_1,map<int,int>& set_2,bool temp,int d){
    int len = que.size();
    int ans = 0xffffffff;
    while(len--){
        int top  = que.front();
        que.pop();
        if(set_1.find(top+1) == set_1.end()){
               set_1[top+1] = d;
               que.push(top+1);
              if(set_2.find(top+1) != set_2.end()){
                  ans = max(d + set_2[top+1],ans);
              }
        }
        
        if(set_1.find(top-1) == set_1.end()){
               set_1[top-1] = d;
               que.push(top-1);
              if(set_2.find(top-1) != set_2.end()){
                    ans = max(d+set_2[top-1],ans);
              }
        }
        if(temp == true){
            if(set_1.find(top*N) == set_1.end()){
                   set_1[top*N] = d;
                  que.push(top*N);
                if(set_2.find(top*N) != set_2.end()){
                ans = min(set_2[top*N] + d,ans);
            }
        }
        }else{
            if(N != 0 && top % N == 0){
                if(set_1.find(top/N) == set_1.end()){
                    set_1[top/N] = d;
                    que.push(top/N);
                    if(set_2.find(top/N) != set_2.end()){
                       ans = min(set_2[top/N]+d,ans);
                    }
                }
            }
        }
      
    }
    return ans;
}
int bfs(int s,int e,int n){
    queue<int> que1;
    queue<int> que2;
    map<int,int> set1;
    map<int,int> set2;
    que1.push(s);
    set1[s] = 0;
    que2.push(e);
    set2[e] = 0;
    if(s == e){
        return 0;
    }
    int d1 = 0;
    int d2 = 0;
    while(que1.size() && que2.size()){
        if(que1.size() < que2.size()){
            d1++;
            int t = extend(que1,n,set1,set2,true,d1);
            if(t != 0xffffffff){
                //cout<<d1<<" "<<d2<<endl;
                return t;
            }
        }else{
            d2++;
            int t = extend(que2,n,set2,set1,false,d2);
            if(t != 0xffffffff){
                // cout<<d1<<" "<<d2<<endl;
                return t;
            }
        }
    }
    return -1;
}
int main(){
    cin>>k;
    while(k--){
        int s,e,n;
        cin>>s>>e>>n;
        int a = bfs(s,e,n);
        cout<<a<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值