752.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * @Description:
  3. * @Version: 1.0
  4. * @Autor: zhuyijun
  5. * @Date: 2021-11-14 15:33:16
  6. * @LastEditTime: 2021-11-14 16:30:35
  7. */
  8. #include <bits/stdc++.h>
  9. using namespace std;
  10. string plusOne(string s, int j) {
  11. if (s[j] == '9') {
  12. s[j] = '0';
  13. } else {
  14. s[j] += 1;
  15. }
  16. return s;
  17. }
  18. string minusOne(string s, int j) {
  19. if (s[j] == '0') {
  20. s[j] = '9';
  21. } else {
  22. s[j] -= 1;
  23. }
  24. return s;
  25. }
  26. int openLock(vector<string>& deadends, string target) {
  27. set<string> deads;
  28. deads.insert(deadends.begin(), deadends.end());
  29. // for (string s : deadends) {
  30. // deads.insert(s);
  31. // }
  32. //记录已经穷举过得密码,防止走回头路
  33. set<string> visited;
  34. int step = 0;
  35. queue<string> q;
  36. q.push("0000");
  37. visited.insert("0000");
  38. while (!q.empty()) {
  39. int sz = q.size();
  40. for (int i = 0; i < sz; i++) {
  41. string cur = q.front();
  42. q.pop();
  43. cout << cur << endl;
  44. //判断是否达到终点
  45. if (deads.find(cur) != deads.end()) {
  46. continue;
  47. }
  48. if (cur == target) {
  49. return step;
  50. }
  51. for (int j = 0; j < 4; j++) {
  52. string up = plusOne(cur, j);
  53. if (visited.find(up) == visited.end()) {
  54. q.push(up);
  55. visited.insert(up);
  56. }
  57. string down = minusOne(cur, j);
  58. if (visited.find(down) == visited.end()) {
  59. q.push(down);
  60. visited.insert(down);
  61. }
  62. }
  63. }
  64. //增加步数
  65. step++;
  66. }
  67. return -1;
  68. }
  69. int main() {
  70. vector<string> deadends{"0201", "0101", "0102", "1212", "2002"};
  71. string s = "0202";
  72. cout << openLock(deadends, s);
  73. return 0;
  74. }