GYM - 101503L Remote Control



题意:给你一个特殊的遥控器,问你换台所需按按键的最小次数。


解题思路:台数很少,爆搜即可。


#include<iostream>
#include<bitset>
#include<queue>
using namespace std;
typedef long long int ll;
const ll INF=(1LL<<62);

bool ok[15];//记录遥控器按钮状态
bool vis[1000];//记录当前台是否被访问过

struct point{
    int num;
    int step;
    point(int a=0,int b=0){
        num=a;
        step=b;
    }
};

int ans=10000;

void bfs(int s,int e){
    
    queue<point> que;
    
    que.push(point(s,0));
    
    vis[s]=1;
    
    while(!que.empty()){
        
        point tp=que.front();
        que.pop();
        vis[tp.num]=1;
        vis[e]=0;
        
        if(tp.num==e){
            ans=min(tp.step,ans);
            continue;
        }	
        
        //直接按单个按钮
        for(int i=1;i<=10;i++)
            if(ok[i]&&vis[i%10]==0)
                que.push(point(i%10,tp.step+1));
            
        
        //下一台
        int temp=0;
        if(tp.num+1==100)
            temp=0;
        else
            temp=tp.num+1;
        if(ok[11]&&vis[temp]==0)
            que.push(point(temp,tp.step+1));
            
        
        //上一台
        temp=0;
        if(tp.num-1==-1)
            temp=99;
        else
            temp=tp.num-1;
        
        if(ok[12]&&vis[temp]==0)
            que.push(point(temp,tp.step+1));
            
        //双位数
        if(ok[13]){
            for(int i=1;i<=10;i++)
                for(int j=1;j<=10;j++){
                    int x=i%10;
                    int y=j%10;
                    if(ok[i]&&ok[j]&&vis[x*10+y]==0)
                        que.push(point(x*10+y,tp.step+3));
                       	
                }
        }
          
    }
     
    if(ans==10000)
        ans= -1;
}


int main(){
    
    //这样输入方便搜索
    for(int i=1;i<=3;i++)
        cin>>ok[i];
    cin>>ok[11];
    for(int i=4;i<=6;i++)
        cin>>ok[i];
    cin>>ok[12];
    for(int i=7;i<=9;i++)
        cin>>ok[i];
    cin>>ok[13];
    cin>>ok[10];
    
    int X,Y;
    cin>>X>>Y;
    
    bfs(X,Y);
    cout<<ans<<endl;
    
    
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值