ccf认证 201809-3 元素选择器
程序员文章站
2022-04-27 22:37:50
...
这道题比赛的时候是拿了满分,用的c++,现在用java实现才得了90分, 头疼。。。
思路:
用结构体储存每一个元素,那么应包含
- 1、等级
- 2、属性
- 3、标签
元素选择的话拆分成字符串数组,因此对元素字符串数组的每一项进行匹配,匹配完了的话,即得到答案。
举个例子,假设元素选择器为 div p,那么应当在元素数组中先找到div,然后接着这个位置向下找,找到p。则完成一次查找,然后回溯,寻找下一个答案。(要注意的是答案不可以重复,因此用Set存)
代码:(写得比较乱)
import java.util.*;
class Node{
int level;
String div;
String id;
}
public class Main{
private static Scanner cin;
public static List<Node> list = new ArrayList<>();
public static Set<Integer> set = new LinkedHashSet<>();
public static void main(String[] args) {
cin = new Scanner(System.in);
int n = cin.nextInt();
int m = cin.nextInt();
cin.nextLine();
list.clear();
for(int i=1;i<=n;i++){
String tmp = cin.nextLine();
//System.out.println("读入的是 " + tmp);
Node node = new Node();
int pos = 0;
while (tmp.charAt(pos) == '.'){
pos++;
}
node.level = pos;
tmp = tmp.substring(pos);
for(String item : tmp.split(" ")){
if(item.charAt(0) == '#')
node.id = item;
else node.div = item;
}
list.add(node);
}
// for(Node node : list){
// System.out.println(node.level + " " + node.div + " " + node.id);
// }
while(m-->0){
set.clear();
String choose = cin.nextLine();
String [] chooses = choose.split(" ");
dfs(0,-1,0,chooses);
System.out.print(set.size());
for(Integer item : set){
System.out.print(" "+item);
}
System.out.println();
}
}
public static void dfs(int idx,int fatherLevel ,int idc, String[] chooses){
// System.out.println("我现在要寻找: "+ chooses[idc] + " 我在数组处于: "+ idx + " 在查找数组里处于: " + idc);
if(idc == chooses.length){
//System.out.println("get到的idx "+ idx);
set.add(idx);
return ;
}
// 找不到了,返回
if(idx == list.size())
return ;
for(int i = idx;i<list.size();i++){
Node node = list.get(i);
if(node.level <= fatherLevel)
return ;
String choose = chooses[idc];
//System.out.println("当前处理 " + choose);
if( (node.div!=null && node.div .equals(choose)) ||(node.id!=null&& node.id.equals(choose)) ){
//System.out.println("找到了一个 " + choose + "下一个处理: " + idc);
dfs(i+1,node.level,idc+1,chooses);
}
}
}
}
/*
11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #one
......div
........p #two
*/
路过的大哥知道90分的原因请告知!!
下一篇: 经典伤感的现代爱情诗
推荐阅读