LSH一觉醒来发现被人关在了一间密室之中……密室中只有一扇诡异的门,门上有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每个拨轮可以自由旋转:例如把 '9' 变为 '0','0' 变为 '9' 。每次旋转都只能旋转一个拨轮的一位数字。转盘锁的初始数字是 0000 ,现在LSH需要破解出密码逃出密室。而很不幸的是,这个转盘锁带有一组死亡数字,如果LSH不慎将转盘锁上的数字与任何一个死亡数字吻合,则转盘锁会永久锁定,他将永远逃不出密室。现在作为ACMer的你,能否帮帮LSH逃出密室?
输入描述:输入样例由多组测试数据组成。每组测试数据第一行输入一个正整数n ( 1 <= n <= 500 )代表死亡数字的数量。
接下来n行,每行输入一个字符串 ni 代表死亡数字 ni ( ni的范围为 0000 ~ 9999 )
最后一行输入一个字符串t,代表转盘锁的正确密码 ( t 的范围为 0000 ~ 9999 )
数据约束:保证每个测试文件数据不超过20组测试样例
输出描述:你需要输出LSH将转盘锁转到正确答案的最小的旋转次数,如果无论如何不能解锁,输出 -1。
思路:bfs题目,字符串进行处理,用map进行标记,将死亡数字标记为1,然后将开始搜索,但是有一个坑点:0000(开始数字)可能也是死亡数字这样子直接输出-1,还有目标数字是死亡数字的时候也是直接输出-1,其他情况就正常bfs即可
#includeusing namespace std; map mp; string s; struct node{ string ss; int st; }; struct cmp{ bool operator()(node a, node b){ return a.st > b.st; } }; bool check(string sss){ if(!mp.count(sss)){ return true; } return false; } void bfs(){ priority_queue , cmp> q; bool flag = 0; q.push({"0000", 0}); mp["0000"] = 1; while(!q.empty()){ string ss = q.top().ss; int st = q.top().st; q.pop(); if(ss == s){ cout << st << endl; flag = 1; break; } for(int i = 0; i < 4; i++){ string sss = ss; if(sss[i] != '9'){ sss[i] ++; }else{ sss[i] = '0'; } if(check(sss)){ mp[sss] = 1; q.push({sss, st + 1}); } sss = ss; if(sss[i] != '0'){ sss[i] --; }else{ sss[i] = '9'; } if(check(sss)){ mp[sss] = 1; q.push({sss, st + 1}); } } } if(flag == 0){ cout << -1 << endl; } } int main(){ int n; while(cin >> n){ mp.clear(); for(int i = 0; i < n; i++){ cin >> s; mp[s] = 1; } cin >> s; if(mp.count(s)){ cout << -1 << endl; continue; } if(mp.count("0000")){ cout << -1 << endl; continue; } bfs(); } return 0; }



