用BFS从“0000”开始遍历,套用BFS模板就行,只是多了判断是否需要继续拓展的条件(用set存,方便查)。
class Solution { public: int openLock(vector<string>& deadends, string target) { const string start="0000"; //用set存死锁情况方便查 unordered_set<string> dead(deadends.begin(),deadends.end()); //目标值为0000直接返回0 if(target=="0000")return 0; //一开始锁就是死的,返回-1 if(dead.count(start))return -1; queue<string> q; //保存已遍历的情况 unordered_set<string> visited{"0000"}; int steps=0; q.push(start); //开始BFS while(!q.empty()){ ++steps; //对当前栈内的情况进行BFS const int size=q.size(); for(int i=0;i<size;i++){ const string curr=q.front(); q.pop(); for(int j=0;j<4;j++){//4位数字 for(int k=-1;k<=1;k+=2){//每位上下拨 string next=curr; next[j]=(next[j]-'0'+k+10)%10+'0'; //找到目标值 if(next==target)return steps; //if。。便什么也不做 if(dead.count(next)||visited.count(next))continue; //不然。。 q.push(next); visited.insert(next); } } } } return -1; } };