int ladderLength(string start, string end, unordered_set<string> &dict) { dict.insert(end); queue<pair<string,int>> q; q.push(make_pair(start,1)); while(!q.empty()) { string s = q.front().first; int len = q.front().second; if(s==end) return len; q.pop(); vector<string> neighbors = findNeighbors(s, dict); for(int i=0; i<neighbors.size(); i++) q.push(make_pair(neighbors[i],len+1)); } return 0; }
int ladderLength(string beginWord, string endWord, unordered_set<string>& wordList) { if(canConcat(beginWord, endWord)) return 2; wordList.insert(endWord); queue<pair<string,int>> q; q.push(make_pair(beginWord, 1)); while(!q.empty()){ auto current = q.front(); q.pop(); auto neighbors = findNeighbors(current.first, wordList); for(auto& w : neighbors){ if(w == endWord) return current.second + 1; q.push(make_pair(w, current.second + 1)); } } return 0; }
void FieldLineDetector::findTransformation(cv::Mat& src, cv::Mat& imgDst, std::vector<cv::Point2f>& modelBots, cv::Mat& H) { this->botPosField = modelBots; Mat imgBw; blur(src, imgBw, Size(5, 5)); cvtColor(imgBw, imgBw, CV_BGR2GRAY); Mat imgEdges; Canny(imgBw, imgEdges, 50, 100, 3); // imshow("bw", imgBw); // imshow("edges", imgEdges); std::vector<cv::Vec4i> lines; HoughLinesP(imgEdges, lines, 1, CV_PI / 180, min_threshold + p_trackbar, minLineLength, maxLineGap); // Expand the lines little bit (by scaleFactor) for (int i = 0; i < lines.size(); i++) { cv::Vec4i v = lines[i]; cv::Point2f p1 = Point2f(v[0], v[1]); cv::Point2f p2 = Point2f(v[2], v[3]); cv::Point2f p1p2 = p2 - p1; float length = norm(p1p2); cv::Point2f scaleP2 = p2 + p1p2 * (scaleFactor / 10.0f); cv::Point2f scaleP1 = p1 - p1p2 * (scaleFactor / 10.0f); lines[i][0] = scaleP1.x; lines[i][1] = scaleP1.y; lines[i][2] = scaleP2.x; lines[i][3] = scaleP2.y; } createThresholdedImg(src); // do line detection! detectCorners(lines); filterCorners(); findNeighbors(lines); findCornerMapping(mappedEdges); for (int i = 0; i < mappedEdges.size(); i++) { cout << (*mappedEdges[i]) << endl; } findFieldMatch(mappedEdges, H); if (imgDst.cols > 0) { // Draw lines for (int i = 0; i < lines.size(); i++) { cv::Vec4i v = lines[i]; cv::line(imgDst, cv::Point(v[0], v[1]), cv::Point(v[2], v[3]), cv::Scalar(0, 255, 0), 2); } // draw corners for (int i = 0; i < cornerBuffer.size(); i++) { cv::circle(imgDst, cornerBuffer.at(i), 1, cv::Scalar(255, 0, 0), 2); } // draw filtered corners for (int i = 0; i < detectedCorners.size(); i++) { circle(imgDst, detectedCorners[i]->point, (int) 20, Scalar(0, 255, 255), 1); } // draw detected corner coordinates for (int i = 0; i < detectedCorners.size(); i++) { stringstream ss; ss << detectedCorners[i]->point; putText(imgDst, ss.str(), detectedCorners[i]->point + Point2f(0, 10), FONT_HERSHEY_PLAIN, 1, Scalar(250, 0, 0)); } } }