能否跳完N个格子
题目:
地上共有N个格子,你需要跳完地上所以的格子,但是格子间是有强依赖关系的,跳完前一个格子后,后续的格子才会被开启,给质检的依赖关系由多组steps数组给出,steps[0]表示前一个格子,steps[1]表示steps[0]可以开启的格子:比如[0,1]表示从跳完第0个格子以后第一个格子就开启了,再比如[2,1],[2,3]表示跳完第2个格子后第1个格子和第3个格子就被开启了。请计算能够否由给出的steps数组跳完所有的格子,如果可以输出yes,否则输出no。
说明:1,你可以从一个格子跳到任意一个开启的格子;2,没有前置依赖条件的格子默认就是开启的;3,如果总数是N,则所有格子编号为[0,N-1]连续数组。输入为一个数组N表示总共有多少格子,接着输入多组二维数组steps表示所有格子之间的依赖关系;输出为,如果能按照steps给出的依赖关系跳完所有格子,输出yes,否则输出no。
示例1:
输入:
3
[0,1]
[0,2]
输出:
yes
示例2:
输入:
2
[1,0]
[0,1]
输出:
no
示例3:
输入:
6
[0,1]
[0,2]
[0,3]
[0,4]
[0,5]
输出:
yes
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
scan.nextLine();
List<List<Integer>> grip = new LinkedList<>();
while (true) {
String line = scan.nextLine();
List<Integer> relation = new LinkedList<>();
// 如果当前行为空
if (line.isEmpty()) {
break; //遇空行,停止输入
} else {
// 非空行,添加到输入列表
String[] temp = line.split(" ");
relation.add(Integer.parseInt(temp[0]));
relation.add(Integer.parseInt(temp[1]));
grip.add(relation);
}
}
String result = gripJump(grip,n);
System.out.println(result);
}
private static String gripJump(List<List<Integer>> grip, int n) {
Map<Integer,List<Integer>> map = new HashMap<>();
for(int i=0;i< n;i++){
map.put(i,new LinkedList<>());
}
for(List<Integer> relation : grip){
map.get(relation.get(0)).add(relation.get(1));
}
Queue<Integer> initGrip = new LinkedList<>();
for(int i =0;i< n;i++){
initGrip.add(i);
}
for(List<Integer> relation : grip){
initGrip.remove(relation.get(1));
}
List<Integer> countGripJump = new LinkedList<>();
while(!initGrip.isEmpty()){
int current = initGrip.poll();
countGripJump.add(current);
initGrip.addAll(map.get(current));
}
return countGripJump.size()== n?"yes":"no";
}
#笔试##技术岗笔试题求解#