赞
踩
目录
题目链接:110. 字符串接龙
文章讲解:代码随想录
代码一:广搜法
- #include <iostream>
- #include <vector>
- #include <string>
- #include <unordered_set>
- #include <unordered_map>
- #include <queue>
- using namespace std;
- int main() {
- string beginStr, endStr, str;
- int n;
- cin >> n;
- unordered_set<string> strSet;
- cin >> beginStr >> endStr;
- for (int i = 0; i < n; i++) {
- cin >> str;
- strSet.insert(str);
- }
-
- // 记录strSet里的字符串是否被访问过,同时记录路径长度
- unordered_map<string, int> visitMap; // <记录的字符串,路径长度>
-
- // 初始化队列
- queue<string> que;
- que.push(beginStr);
-
- // 初始化visitMap
- visitMap.insert(pair<string, int>(beginStr, 1));
-
- while(!que.empty()) {
- string word = que.front();
- que.pop();
- int path = visitMap[word]; // 这个字符串在路径中的长度
-
- // 开始在这个str中,挨个字符去替换
- for (int i = 0; i < word.size(); i++) {
- string newWord = word; // 用一个新字符串替换str,因为每次要置换一个字符
-
- // 遍历26的字母
- for (int j = 0 ; j < 26; j++) {
- newWord[i] = j + 'a';
- if (newWord == endStr) { // 发现替换字母后,字符串与终点字符串相同
- cout << path + 1 << endl; // 找到了路径
- return 0;
- }
- // 字符串集合里出现了newWord,并且newWord没有被访问过
- if (strSet.find(newWord) != strSet.end()
- && visitMap.find(newWord) == visitMap.end()) {
- // 添加访问信息,并将新字符串放到队列中
- visitMap.insert(pair<string, int>(newWord, path + 1));
- que.push(newWord);
- }
- }
- }
- }
-
- // 没找到输出0
- cout << 0 << endl;
-
- }
题目链接:105. 有向图的完全可达性
文章讲解:代码随想录
代码一:深搜法
- // 写法一:dfs 处理当前访问的节点
- #include <iostream>
- #include <vector>
- #include <list>
- using namespace std;
-
- void dfs(const vector<list<int>>& graph, int key, vector<bool>& visited) {
- if (visited[key]) {
- return;
- }
- visited[key] = true;
- list<int> keys = graph[key];
- for (int key : keys) {
- // 深度优先搜索遍历
- dfs(graph, key, visited);
- }
- }
-
- int main() {
- int n, m, s, t;
- cin >> n >> m;
-
- // 节点编号从1到n,所以申请 n+1 这么大的数组
- vector<list<int>> graph(n + 1); // 邻接表
- while (m--) {
- cin >> s >> t;
- // 使用邻接表 ,表示 s -> t 是相连的
- graph[s].push_back(t);
- }
- vector<bool> visited(n + 1, false);
- dfs(graph, 1, visited);
- //检查是否都访问到了
- for (int i = 1; i <= n; i++) {
- if (visited[i] == false) {
- cout << -1 << endl;
- return 0;
- }
- }
- cout << 1 << endl;
- }
题目链接:106. 岛屿的周长
文章讲解:代码随想录
代码一:图论法
- #include <iostream>
- #include <vector>
- using namespace std;
- int main() {
- int n, m;
- cin >> n >> m;
- vector<vector<int>> grid(n, vector<int>(m, 0));
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- cin >> grid[i][j];
- }
- }
- int sum = 0; // 陆地数量
- int cover = 0; // 相邻数量
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- if (grid[i][j] == 1) {
- sum++; // 统计总的陆地数量
- // 统计上边相邻陆地
- if(i - 1 >= 0 && grid[i - 1][j] == 1) cover++;
- // 统计左边相邻陆地
- if(j - 1 >= 0 && grid[i][j - 1] == 1) cover++;
- // 为什么没统计下边和右边? 因为避免重复计算
- }
- }
- }
-
- cout << sum * 4 - cover * 2 << endl;
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。