文章目录
- [卡码网 110. 字符串迁移](#卡码网 110. 字符串迁移)
- [卡码网 105. 有向图的完全联通](#卡码网 105. 有向图的完全联通)
- [卡码网 106. 海岸线计算](#卡码网 106. 海岸线计算)
卡码网 110. 字符串迁移
注意如何连接连个字符串,然后使用bfs找到一条最短路径。
java
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String beginStr = sc.next();
String endStr = sc.next();
Queue<String> q = new LinkedList<>();
q.add(beginStr);
sc.nextLine();
Set<String> strset = new HashSet<>();
Map<String, Integer> strmap = new HashMap<>();
strmap.put(beginStr, 1);
for (int i = 0; i < n; i++) {
strset.add(sc.next());
}
while(!q.isEmpty()) {
String word = q.poll();
for (int i = 0; i < word.length(); i++) {
char[] newword = word.toCharArray();
for (char j = 'a'; j <= 'z'; j++) {
newword[i] = j;
String newString = new String(newword);
if (newString.equals(endStr)) {
System.out.println(strmap.get(word) + 1);
return;
}
if (strset.contains(newString) && !strmap.containsKey(newString)) {
strmap.put(newString, strmap.get(word) + 1);
q.add(newString);
}
}
}
}
System.out.println(0);
}
}
卡码网 105. 有向图的完全联通
使用dfs遍历整个图,遍历到的点使用boolean数组标记。
java
import java.util.*;
class Main{
public static void dfs(List<List<Integer>> graph, int node, boolean[] visited) {
if (visited[node] == true) {
return;
}
visited[node] = true;
List<Integer> nodes = graph.get(node);
for (int nextnode : nodes) {
dfs(graph, nextnode, visited);
}
}
public static void main(String[] agrs) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
for (int i = 0; i < k; i++) {
int s = sc.nextInt();
int t = sc.nextInt();
graph.get(s).add(t);
}
boolean[] visited = new boolean[n + 1];
dfs(graph, 1, visited);
for (int i = 1; i <= n; i++) {
if (visited[i] == false) {
System.out.println(-1);
return;
}
}
System.out.println(1);
}
}
卡码网 106. 海岸线计算
检查每一个陆地块的周围是否是边缘或者是水,是的话周长就加1。
java
import java.util.*;
class Main {
static int count;
static int[][] dir = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
public static void helper(int[][] graph, int x, int y) {
for (int i = 0; i < 4; i++) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (nextx < 0 || nexty < 0 || nextx >= graph.length || nexty >= graph[0].length || graph[nextx][nexty] == 0) {
count++;
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] graph = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
graph[i][j] = sc.nextInt();
}
}
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
count = 0;
if (graph[i][j] == 1) {
helper(graph, i, j);
res += count;
}
}
}
System.out.println(res);
}
}