题目描述
现在有一个紧急的任务是打开一个密码锁。 密码由四位数字组成,数字范围是0到9。每次可以对任何一位数字加1或减1。当将9加1时,数字将变为0,当将0减1时,数字将变为9
先输入一组死亡数字字符串(不能拨到的数字字符串) 以及初始密码和正确密码。
请你计算出最少需要拨动几次密码锁可以从初始密码拨到正确密码。
输入
第一行输入n,表示死亡数字字符串的个数
接下来n行,依次输入n个死亡数字字符串
接下来两行分别输入初始密码以及正确密码
输出
最少拨动的次数
代码实现
#include<iostream>
#include<string>
#include<queue>
#include<set>
using namespace std;
// 死亡数字数量
int n;
// 向上拨
string plusOne(string code,int j){
if(code[j]=='9'){
code[j]='0';
}else{
code[j]+=1;
}
return code;
}
// 向下拨
string minusOne(string code,int j){
if(code[j]=='0'){
code[j]='9';
}else{
code[j]-=1;
}
return code;
}
int BFS(string start,string target,string deadcodes[]){
queue<string> q;
set<string> visited;
q.push(start);
for(int i=0;i<n;++i){
visited.insert(deadcodes[i]);
}
int step=0;
while(!q.empty()){
int sz=q.size();
for(int i=0;i<sz;++i){
string cur=q.front();
// cout<<cur<<endl;
q.pop();
if(cur==target){
return step;
}
for(int i=0;i<4;++i){
string up=plusOne(cur,i);
if(!visited.count(up)&&!visited.count(up)){
q.push(up);
visited.insert(up);
}
string down=minusOne(cur,i);
if(!visited.count(down)&&!visited.count(down)){
q.push(down);
visited.insert(down);
}
}
}
++step;
// cout<<step<<endl;
}
}
int main(){
cout<<"输入死亡数字数量:"<<endl;
cin>>n;
string deadcodes[n];
string start,target;
cout<<"依次输入"<<n<<"个死亡数字:"<<endl;
for(int i=0;i<n;++i){
cin>>deadcodes[i];
}
cout<<"输入初始密码:"<<endl;
cin>>start;
cout<<"输入正确密码:"<<endl;
cin>>target;
cout<<BFS(start,target,deadcodes);
return 0;
}