典型的排列数搜索,用java写是因为便于进行输入处理
- import java.io.BufferedInputStream;
- import java.util.Scanner;
- import java.util.SortedSet;
- import java.util.TreeSet;
- public class Main {
- int N;
- char[] arrs;
- char[] rules;
- //输出不用排序,直接是排序好的
- SortedSet<String> set = new TreeSet<String>();
- /**
- * 检查函数
- * @param a
- * @return
- */
- boolean canPrint(char[] a) {
- String s = String.valueOf(a);
- boolean canPrint = true;
- //一对一对的char检查
- for(int i=0;i<rules.length-1;i+=2) {
- char aa = rules[i];
- char bb = rules[i+1];
- if(s.indexOf(aa)>s.indexOf(bb)) {
- canPrint = false;
- break;
- }
- }
- return canPrint;
- }
- //回溯法
- void Backtrack(int t) {
- if(t>=N) {
- if(canPrint(arrs))
- set.add(String.valueOf(arrs));
- }
- else {
- for(int i=t;i<N;i++) {
- //swap(arrs[t],arrs[i]);交换
- char c = arrs[t];
- arrs[t] = arrs[i];
- arrs[i] = c;
- Backtrack(t+1);
- //swap(arrs[t],arrs[i]);还原
- char d = arrs[t];
- arrs[t] = arrs[i];
- arrs[i] = d;
- }
- }
- }
- public static void main(String args[]) {
- Scanner cin = new Scanner(new BufferedInputStream(System.in));
- while(cin.hasNext()) {
- String s1 = cin.nextLine();
- String s2 = cin.nextLine();
- Main mm = new Main();
- String[] ss = s1.split(" ");
- String[] rr = s2.split(" ");
- mm.arrs = new char[ss.length];
- for(int i=0;i<ss.length;i++) {
- mm.arrs[i] = ss[i].charAt(0);
- }
- mm.rules = new char[rr.length];
- for(int i=0;i<rr.length;i++) {
- mm.rules[i] = rr[i].charAt(0);
- }
- mm.N = mm.arrs.length;
- mm.Backtrack(0);
- for(String abc:mm.set)
- System.out.println(abc);
- System.out.println("");
- mm.set.clear();
- }
- }
- }