2021 icpc 沈阳站 J

 数字锁问题

运用bfs 打表。

把所有情况看为从0000开始变换。例如1234-2345,就是0000-1111。总共有10^4 种情况,打表。

J: Luggage Lock

#include<bits/stdc++.h>
using namespace std;
int v[10000]={0};
int m[10000]={0};
int change(int k[4]){
    return 1000*k[0]+100*k[1]+10*k[2]+k[3];
}
int w[20][4]={0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,9,0,0,9,0,0,9,0,0,9,0,0,0,0,0,1,1,0,1,1,0,1,1,0,0,0,0,9,9,0,9,9,0,9,9,0,0,0,1,1,1,1,1,1,0,0,9,9,9,9,9,9,0,1,1,1,1,9,9,9,9};
void bfs(){
    queue <int> q;
    int v0=0;
    int t,n[4],t1,t0;
    q.push(v0);
    v[v0]=1;
    while(!q.empty()){
        t=q.front();
        t0=t;
        q.pop();
        for(int i=0;i<4;i++){
            n[3-i]=t%10;
            t/=10;
        }        
        for(int i=0;i<20;i++){
            t1=((n[0]+w[i][0]+10)%10)*1000+((n[1]+w[i][1]+10)%10)*100+((n[2]+w[i][2]+10)%10)*10+((n[3]+w[i][3]+10)%10);
            if(!v[t1]){
                v[t1]=1;
                q.push(t1);
                m[t1]=m[t0]+1;
            }
        }
    }
}
int main(){
    int i,j,t,T,a0,b0,a[4],b[4];
    int k[4];
    bfs();
    cin>>T;
    while(T--){
        cin>>a0>>b0;
        for(i=0;i<4;i++){
            a[3-i]=a0%10;
            a0/=10;
            b[3-i]=b0%10;
            b0/=10;
            k[3-i]=(b[3-i]-a[3-i]+10)%10;
        }
        t=change(k);
        cout<<m[t]<<endl;
    }
    
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值