牛客.单词搜索
刚开始我就想是搜索,但是不清楚bfs还是dfs更好,我尝试了bfs但是队列存东西,没有我想象的那么好写,所以我决定试试dfs
import java.util.*; public class Solution { static int m = 0; static int n = 0; static int []dx = {1, -1, 0, 0}; static int []dy = {0, 0, 1, -1}; static boolean [][]vis; static char[]word; /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param board string字符串一维数组 * @param word string字符串 * @return bool布尔型 */ public static boolean exist (String[] board, String _word) { m = board.length; n = board[0].length(); word = _word.toCharArray(); char[][]a = new char[m][n]; vis = new boolean[m][n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (board[i].charAt(j) == word[0]) { vis[i][j] = true; //标记 if (dfs(board, i, j, 0) == true) { return true; }; vis[i][j]=false; //回溯 } } } return false; } private static boolean dfs(String[] board, int i, int j, int pos) { if (pos == word.length - 1) { return true; } for (int ii = 0; ii < 4; ii++) { int x = i + dx[ii]; int y = j + dy[ii]; //注意这里是pos+1传递的是第几个下标 if (x >= 0 && x < m && y >= 0 && y < n && board[x].charAt(y) == word[pos + 1] && vis[x][y] == false) { vis[x][y] = true; //标记 if ( dfs(board, x, y, pos + 1) == true) { return true; }; vis[x][y] = false; //回溯 } } return false; } }
牛客.杨辉三角
还想起来我第一次处理这个的时候,怎么想也不知道怎么写,那时候我是大一下学期刚学数据结构,然后到了今天,虽然我不是特别厉害,但是还是有所进步的,这个问题的想法,由于它是由上一行的这个和上一行的左边这个加一起,我的想法瞬间就想起来了dp,于是使用了dp处理这个问题
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int a = scanner.nextInt(); int[][]b = new int[a + 1][a + 1]; for (int i = 0; i <= a; i++) b[i][0] = 1; for (int i = 1; i <= a; i++) { for (int j = 1; j <= i; j++) { b[i][j] = b[i - 1][j - 1] + b[i - 1][j]; } } for (int i = 0; i < a; i++) { for (int j = 0; j <= i; j++) { if (b[i][j] != 0) { StringBuffer ret = new StringBuffer(); int len = Integer.toString(b[i][j]).length(); for (int k = 0; k < 5 - len; k++) ret.append(" "); System.out.print(ret.toString() + b[i][j]); } } if (i + 1 != a) System.out.println(); } } }
牛客.游游的you
输入输出是因为我想熟悉一下模版,这道题,不用也可以。就是看连续的o就-1,先找对应的you,再去找oo
import java.util.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.BufferedWriter; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(System.out))); public static void main(String[] args)throws IOException { Read scanner = new Read(); int a1 = scanner.nextInt(); int[][] a = new int[a1][3]; int[] dp = new int[a1]; int[] count = new int[a1]; for (int i = 0; i < a1; i++) { int min = Integer.MAX_VALUE; for (int j = 0; j < 3; j++) { a[i][j] = scanner.nextInt(); min = Math.min(a[i][j], min); } count[i] = a[i][1]; dp[i] = min; } int sum = 0; for (int i = 0; i < a1; i++) { if (count[i] - dp[i] - 1 <= 0) sum = dp[i] * 2; else sum = dp[i] * 2 + (count[i] - dp[i] - 1) ; System.out.println(sum); } // 注意 hasNext 和 hasNextLine 的区别 } } class Read { StringTokenizer st = new StringTokenizer(""); BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); String next()throws IOException { while (!st.hasMoreTokens()) { st = new StringTokenizer(bf.readLine()); } return st.nextToken(); } String nextLine()throws IOException { return bf.readLine(); } int nextInt() throws IOException { return Integer.parseInt(next()); } long nextLong()throws IOException { return Long.parseLong(next()); } double nextDouble()throws IOException { return Double.parseDouble(next()); } }
牛客.腐烂的苹果
常规的bfs,使用vis来标记,然后就直接宽度搜索,用一个队列,放循环里面,然后,分两块往下面遍历(因为这是1s,所以把它放到sz出去,因为这个sz的作用是用来,统计一个烂苹果能感染多少组好苹果,然后把这些好苹果放到里面)
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param grid int整型ArrayList<ArrayList<>> * @return int整型 */ static int []dx = {0, 0, 1, -1}; static int []dy = {1, -1, 0, 0}; public static int rotApple (ArrayList<ArrayList<Integer>> grid) { int m = grid.size(); int n = grid.get(0).size(); int ret = 0; boolean[][]vis = new boolean[m][n]; Queue<int[]>q = new LinkedList<>(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (grid.get(i).get(j) == 2) { q.add(new int[] {i, j}); vis[i][j] = true; } } } while (!q.isEmpty()) { int sz = q.size(); while (sz > 0) { int []k = q.poll(); sz--; for (int i = 0; i < 4; i++) { int x = dx[i] + k[0]; int y = dy[i] + k[1]; if (x >= 0 && x < m && y >= 0 && y < n && grid.get(x).get(y) == 1 && vis[x][y] == false) { q.add(new int[] {x, y}); vis[x][y] = true; } } } ret++; } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (grid.get(i).get(j) == 1 && vis[i][j] == false) { return -1; } } } return ret - 1; } // write code her }