1. 程式人生 > >ccf認證 201809-3 元素選擇器

ccf認證 201809-3 元素選擇器

這道題比賽的時候是拿了滿分,用的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 .equalsIgnoreCase(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分的原因請告知!!(標籤判斷時需要忽略大小寫)