3.30 华为笔试 软件岗第一题第二题过
第二题是一个bfs路径搜索,记得剪枝
import java.util.*;
public class Main {
static int m,n;
static int[][] map;
static int[] start;
static int[] end;
static int mindis = Integer.MAX_VALUE;
static int count = 0;
static int[][] turn = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
m = scanner.nextInt();
n = scanner.nextInt();
map = new int[m][n];
start = new int[3];
start[0] = scanner.nextInt();
start[1] = scanner.nextInt();
start[2] = 0;
end = new int[3];
end[0] = scanner.nextInt();
end[1] = scanner.nextInt();
end[2] = 0;
int k = scanner.nextInt();
for(int i = 0;i<k;i++){
int x = scanner.nextInt();
int y = scanner.nextInt();
map[x][y] = -1;
}
BFS();
System.out.print(count);
System.out.print(' ');
System.out.print(mindis);
}
public static void BFS(){
Queue<int[]> queue = new LinkedList<>();
queue.add(start);
while (!queue.isEmpty()){
int[] cur = queue.poll();
int x = cur[0];
int y = cur[1];
int step = cur[2];
if(x == end[0] && y == end[1]){
if(step < mindis){
mindis = step;
count = 1;
}
else if(step == mindis){
count ++;
}
continue;
}
map[x][y] = 1;
if(step >= mindis) continue;
for(int i=0;i<4;i++){
int next_x = x + turn[i][0];
int next_y = y + turn[i][1];
int next_step = step + 1;
if(next_x>=0 && next_x<m && next_y>=0 && next_y<n && map[next_x][next_y]==0){
queue.add(new int[]{next_x,next_y,next_step});
}
}
}
}
} 第一题就是个模拟,两个整数维护AB对应的芯片标号即可,记得在切换芯片的时候把tag置为0(代码写的很丑,可以自行优化一下) 对了这个题有个坑,就是输入是包含空格的,一开始以为没有空格,0了好几把才get这里还有空格(手动汗一个。。。)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = -1;
int a_tag = 0;
int b = -1;
int b_tag = 0;
int m = scanner.nextInt();
int n = scanner.nextInt();
String[] s = new String[n];
for(int i = 0;i<n;i++){
s[i] = scanner.next();
}
for(int i=0;i<n;i++){
if(s[i].equals("A")){
if(a==-1){
a = b+1;
a_tag++;
}else{
if(a_tag < 4){
a_tag++;
}
else{
a = Math.max(a,b) + 1;
a_tag = 0;
a_tag++;
}
}
}else{
if(b==-1){
b = a+1;
b_tag++;
}
else{
if(b_tag < 1){
b_tag++;
}
else{
b = Math.max(a,b)+1;
b_tag = 0;
b_tag++;
}
}
}
}
if(s[n-1].equals("A")){
if(a+1<=m) {
System.out.println(a + 1);
System.out.println(a_tag);
}else{
System.out.println(0);
System.out.println(0);
}
}else{
if(b+1<=m) {
System.out.println(b + 1);
System.out.println(b_tag);
}else{
System.out.println(0);
System.out.println(0);
}
}
}
} 第三题 这个树着实在我知识盲区 就写了一下建树的过程 旁边的同学好像卡在输入输出了 建完树直接sout(-1) 30分到手,哈哈~


查看19道真题和解析