DAY53-图论BFS

kama110.字符串接龙

java 复制代码
	/**
	 * 遍历每个字母和每个位置替换
	 * @param args
	 */
	public static void main(String[] args) {
		//读取
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.nextLine();
		String startStr=scan.next();
		String endStr=scan.next();
		scan.nextLine();
		
		//set集合来存储字符串
		Set<String> set = new HashSet<>();
		for(int i=0;i<n;i++) {
			String s = scan.nextLine();
			set.add(s);
		}

		int res = countPath(set,startStr,endStr);
		System.out.println(res);
		scan.close();
	}
	
	public static int countPath(Set<String> set,String startStr,String endStr) {
		//path集合来标记走过的路径,BFS是向外扩散,无向图需要记录不走回头路
		Map<String,Integer> map = new HashMap<>();
		map.put(startStr, 1);
		
		//创造队列
		Queue<String> queue = new LinkedList<>();
		queue.offer(startStr);
		int path=0;
		
		while(!queue.isEmpty()) {
			String str = queue.poll();
			path = map.get(str);
			
			for(int i=0;i<str.length();i++) {
				char[] str1 = str.toCharArray();
				//遍历26个字母求得新字符串
				for(char j='a';j<='z';j++) {
					str1[i]=j;
					String newStr = new String(str1);
					
					//当走到end字段则返回
					if(newStr.equals(endStr)) return path+1;
					
					//将路径加入map中
					if(set.contains(newStr)&&!map.containsKey(newStr)) {
						map.put(newStr,path+1);
						queue.offer(newStr);
					}
				}
			}
		}
		
		return 0;
	}

kama105.有向图的完全可达性

java 复制代码
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n=scan.nextInt();
		int m=scan.nextInt();
		
		int[][] isoland = new int[n+1][n+1];
		
		for(int i=0;i<m;i++) {
			int x = scan.nextInt();
			int y = scan.nextInt();
			isoland[x][y]=1;
		}
		
		Queue<Integer> queue = new LinkedList<>();
		queue.add(1);
		
		Set<Integer> set = new HashSet<>();
		set.add(1);
		
		while(!queue.isEmpty()) {
			int now = queue.remove();
			
			for(int i=1;i<=n;i++) {
				if(isoland[now][i]==1&&!set.contains(i)) {
					set.add(i);
					queue.add(i);
				}
			}
		}
		
		if(set.size()==n) {
			System.out.println(1);
		}else {
			System.out.println(-1);
		}
		
		scan.close();
	}

kama106.岛屿的周长

java 复制代码
	public static int[][] step = {{1,0},{0,1},{-1,0},{0,-1}};
	
	public static void main(String[] args) {
		//读取
		Scanner scan = new Scanner(System.in);
		int n=scan.nextInt();
		int m=scan.nextInt();
		
		int[][] isoland = new int[n][m];
		
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				isoland[i][j]=scan.nextInt();
			}
		}
		int sum=0;
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				//如果该位置是岛屿,计算边长
				if(isoland[i][j]==1) {
					int count=0;
					//上下左右
					for(int k=0;k<4;k++) {
						int k1=i+step[k][0];
						int k2=j+step[k][1];
						
						if(k1<0||k1>n-1||k2<0||k2>m-1) {
							count++;
						}else {
							if(isoland[k1][k2]==0)count++;
						}
					}
					sum+=count;
				}
			}
		}
		System.out.println(sum);
		scan.close();
	}
相关推荐
二进制person4 小时前
Java SE--方法的使用
java·开发语言·算法
OneQ6664 小时前
C++讲解---创建日期类
开发语言·c++·算法
JoJo_Way4 小时前
LeetCode三数之和-js题解
javascript·算法·leetcode
.30-06Springfield5 小时前
人工智能概念之七:集成学习思想(Bagging、Boosting、Stacking)
人工智能·算法·机器学习·集成学习
凌肖战6 小时前
力扣网C语言编程题:在数组中查找目标值位置之二分查找法
c语言·算法·leetcode
weixin_478689767 小时前
十大排序算法汇总
java·算法·排序算法
luofeiju7 小时前
使用LU分解求解线性方程组
线性代数·算法
SKYDROID云卓小助手8 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理
ysa0510308 小时前
数论基础知识和模板
数据结构·c++·笔记·算法
GEEK零零七8 小时前
Leetcode 1103. 分糖果 II
数学·算法·leetcode·等差数列