题意:给你一个特殊的遥控器,问你换台所需按按键的最小次数。
解题思路:台数很少,爆搜即可。
#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;
}