欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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分的原因请告知!!

相关标签: 元素选择器