ccf認證 201809-3 元素選擇器
阿新 • • 發佈:2018-12-17
這道題比賽的時候是拿了滿分,用的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 */