-
迷宫
L向左,R向右,U向下,D向上
有多少玩家会走出迷宫public class Main { public static void main(String[] args) { int ans=0; for(int i=0;i<10;i++) for(int j=0;j<10;j++) if(ok(i,j)) ans++; System.out.println(ans); } static char[][] ch = new char[][] { "UDDLUULRUL".toCharArray(), "UURLLLRRRU".toCharArray(), "RRUURLDLRD".toCharArray(), "RUDDDDUUUU".toCharArray(), "URUDLLRRUU".toCharArray(), "DURLRLDLRL".toCharArray(), "ULLURLLRDU".toCharArray(), "RDLULLRDDD".toCharArray(), "UUDDUDUDLL".toCharArray(), "ULRDLUURRR".toCharArray()}; static boolean ok(int x,int y) { int t = 25; while (t-- > 0) { if (x < 0 || x >= 10 || y < 0 || y >= 10) return true; if (ch[x][y] == 'U') x--; else if (ch[x][y] == 'D') x++; else if (ch[x][y] == 'L') y--; else if (ch[x][y] == 'R') y++; } return false; } }
-
9数算式
9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?public class Main { static int[] book = new int[10];//下边有注释 static int[] result = new int[10];//下边也有注释 static int count = 0;//计数 //将dfs生成的10位数全排列序列转成字符串 static String getString(){ StringBuilder stringBuilder = new StringBuilder(); /*当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuilder 类在 Java 5 中被提出它和 StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的(不能同步访问)。由于 StringBuilder相较于 StringBuffer有速度优势所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下则必须使用 StringBuffer 类。*/ for (int i = 0; i < result.length; i++) {//result.length返回长度(字符数) stringBuilder.append(String.valueOf(result[i])); //append将指定的字符串追加到此字符序列;String.valueOf(int i):将int变量i转换成字符串 } return stringBuilder.toString();//返回此序列中数据的字符串表示形式 }//把结果变成字符串 //判断这个数是否由不重复的数组成 static boolean check(int num){ if (String.valueOf(num).length()!=9 || String.valueOf(num).indexOf("0")!=-1) { //int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。 return false; } //哈希表判重,如果重复会插不进去 Set<Integer> set = new HashSet<Integer>();//创建set储存整数 char[] charArray = String.valueOf(num).toCharArray();//toCharArray() 方法将字符串转换为字符数组。 //等式右边的含义:先把num这个整数转换成字符串,再把num转换成的字符串转换成字符数组 //charArray字符数组储存num转换成的字符数组 //所以下一行的charArray.length的含义就是num转换成的字符数组charArray的长度 for (int i = 0; i < charArray.length; i++) { if (set.add((int) charArray[i])==false) {//add()向集合中添加元素,不能添加重复的(重复的添加不了) return false; } } return true; } //dfs枚举0-9的全排列,看是否符合条件 static void dfs(int deep){//deep当前是第几位 for (int i = 0; i <=9; i++) { if (book[i]==0) {//标记i有没有用过 book[i] = 1; result[deep] = i;//储存deep位是什么 dfs(deep+1); book[i] = 0; } } if (deep==10) {//十位数都放好了 String string = getString();//将全排列数组转成字符串 //接下来以0为标志,进行分割,0看成乘号,不能在首位 if (string.charAt(0)=='0' || string.charAt(9)=='0') {//charAt()方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1 return; } //对0进行分割,左边是乘数右边是被乘数 String[] split = string.split("0");//定义字符串数组split,split()方法根据匹配给定的正则表达式来拆分字符串;并储存在字符串数组中 int num1 = Integer.valueOf(split[0]);//"0"左边的是split[0] int num2 = Integer.valueOf(split[1]);//"0"右边的是split[1] if (check(num1*num2)) {//判断乘积是否由不同的数组成 System.out.println(num1 + " X " + num2 + " = " + num1*num2 );//如果由不同的组成,输出 count++;//计数 } return; } } public static void main(String[] args) { dfs(0); System.out.println(count/2);//因为被乘数和乘数位置互换算一种,所以除以2 } }
-
方格分割
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。public class Main { static int[][] a = new int[6][6]; static boolean[][] vis = new boolean[10][10]; static int[][] dir = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; static int cnt = 0; public static void main(String[] args) { vis[3][3] = true; f(3, 3); System.out.println(cnt/4); } private static void f(int x, int y) { // TODO Auto-generated method stub if (x == 0 || x == 6 || y == 0 || y == 6) { cnt++; return; } for (int i = 0; i < 4; i++) { int dx = x + dir[i][0]; int dy = y + dir[i][1]; // 找到一条线,可以分成两半 if (vis[dx][dy] == false) { vis[dx][dy] = true; vis[6-dx][6-dy] = true; f(dx, dy); vis[6-dx][6-dy] = false; vis[dx][dy] = false; } } } }
-
正则问题
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
public class Main { static int len = 0; static String[] arr; public static void main (String args[]) { Scanner sc = new Scanner(System.in); arr = sc.nextLine().split(""); int re = dfs(); System.out.println(re); } // dfs对于每一次()来说 static int dfs() { int result = 0, num = 0; while(len < arr.length) { if (arr[len].equals("(")) { len ++; // 递归之前需要做的事情 num = num + dfs(); } // 递归之后需要做的事情,result是|之后的最大值 else if (arr[len].equals("|")) { len ++; result = Math.max(num, result); num = 0; } // 代表递归的任务完成 else if (arr[len].equals(")")) { len ++; break; } else { len ++; num ++; } } // 当递归到最后一个(的时候,计算|后面的值 result = Math.max(num, result); return result; } }
-
包子凑数
第一行是下面数字的个数
下面是可以使用的数字
使用这些数字凑数,输出凑不出来的数字,如果有无数个,输出INFpublic class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int a[] = new int[101]; for (int i = 1; i <= n; i++) a[i] = sc.nextInt(); int yueshu = a[1]; // 辗转相除法求最大公约数 for (int i = 2; i <= n; i++) { yueshu = yue(yueshu, a[i]); } if (yueshu != 1) { System.out.println("INF"); } else { boolean dp[] = new boolean[10010]; dp[0] = true; for (int i = 1; i <= n; i++) { for (int j = 0; j + a[i] <= 10000; j++) { if (dp[j]) { dp[j + a[i]] = true; } } } int sum = 0; for (int i = 0; i <= 10000; i++) if (dp[i] == false) sum++; System.out.println(sum); } } private static int yue(int x, int y) { if (y == 0) return x; else return yue(y, x % y); } }
蓝桥杯——5
最新推荐文章于 2024-03-19 00:42:44 发布