寒训记录 2021-1-31

上午看了一下stl。。起码有概念了。。具体实践还是看碰上了再说。还差set和map

——————————
——————————
以下题目出自学校acm寒假训练题库,链接在此:
vj搜索专题
Prime Path

bfs思想,由于不熟悉,这个题我是看着别人的题解学习的

记录prime number:
求一个范围内的所有素数,使用埃氏筛法,大大减小复杂度

//将每一个素数的倍数标记为非素数,埃氏筛法;
//门牌号为四位数,所以门牌号最大值不超过9999
bool pri[10010];
void prime()
{
    for(int i=2;i<=9999;++i){
        pri[i]=true;
    }
    for(int i=2;i<=9999;++i){
        if(pri[i]){//确保为当前最小素数
            for(int j=2;j*i<=9999;j++){
                pri[j*i]=false;
            }
        }
    }
}

广度优先搜索BFS:

void bfs(int a,int b)
{
    queue<path> q;//用队列模拟广搜
    path start={a,0};
    q.push(start);
    bool vis[10010]={false};
    vis[start.num]=true;
    while(q.size()){
        int num0=q.front().num;
        int step0=q.front().step;
        if(num0==b){
            ans=step0;
            cout<<ans<<endl;
            break;
        }
        //改变个位(如果i=0必是素数)
        for(int i=1;i<=9;i++){
            int num1=num0/10*10+i;
            if(vis[num1]==false&&pri[num1]==true){
                //cout<<num1<<endl;
                path the={num1,step0+1};
                q.push(the);
                vis[num1]=true;
            }
        }
        //改变十位
        for(int i=0;i<=9;i++){
            int num1=num0/100*100+i*10+num0%10;
            if(vis[num1]==false&&pri[num1]==true){
                //cout<<num1<<endl;
                path the={num1,step0+1};
                q.push(the);
                vis[num1]=true;
            }
        }
        //改变百位
        for(int i=0;i<=9;i++){
            int num1=num0/1000*1000+i*100+num0%100;
            if(vis[num1]==false&&pri[num1]==true){
                //cout<<num1<<endl;
                path the={num1,step0+1};
                q.push(the);
                vis[num1]=true;
            }
        }
        //改变千位,千位不可为0
        for(int i=1;i<=9;i++){
            int num1=i*1000+num0%1000;
            if(vis[num1]==false&&pri[num1]==true){
                //cout<<num1<<endl;
                path the={num1,step0+1};
                q.push(the);
                vis[num1]=true;
            }
        }
        q.pop();
    }
}
int main()
{
    prime();
    int t;
    cin>>t;
    int x,y;
    while(t--){
        cin>>x>>y;
        bfs(x,y);
    }
}

复习一下bfs。。╮( ̄▽ ̄"")╭

———————————
———————————

晚上又学了一下容器,马上就看完了呜呜。

明天早上速度解决容器概念,然后回头来看空下来的那三个贪心题,很有可能那三个题够我搞一天呜呜。

要提高时间的利用效率!!timelogger记一下QwQ

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaaaterinaX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值