POJ 1270 Following Orders

典型的排列数搜索,用java写是因为便于进行输入处理
  1. import java.io.BufferedInputStream;
  2. import java.util.Scanner;
  3. import java.util.SortedSet;
  4. import java.util.TreeSet;
  5. public class Main {
  6.     int N;
  7.     char[] arrs;
  8.     char[] rules;
  9.     //输出不用排序,直接是排序好的
  10.     SortedSet<String> set = new TreeSet<String>();
  11.     /**
  12.      * 检查函数
  13.      * @param a
  14.      * @return
  15.      */
  16.     boolean canPrint(char[] a) {
  17.         String s = String.valueOf(a);
  18.         boolean canPrint = true;
  19.         //一对一对的char检查
  20.         for(int i=0;i<rules.length-1;i+=2) {
  21.             char aa = rules[i];
  22.             char bb = rules[i+1];
  23.             if(s.indexOf(aa)>s.indexOf(bb)) {
  24.                 canPrint = false;
  25.                 break;
  26.             }
  27.         }
  28.         return canPrint;
  29.     }
  30.     //回溯法
  31.     void Backtrack(int t) { 
  32.          if(t>=N) {
  33.              if(canPrint(arrs))
  34.                  set.add(String.valueOf(arrs));
  35.          }
  36.          else { 
  37.              for(int i=t;i<N;i++) {
  38.                  //swap(arrs[t],arrs[i]);交换
  39.                  char c = arrs[t];
  40.                  arrs[t] = arrs[i];
  41.                  arrs[i] = c;
  42.                  Backtrack(t+1); 
  43.                  //swap(arrs[t],arrs[i]);还原
  44.                  char d = arrs[t];
  45.                  arrs[t] = arrs[i];
  46.                  arrs[i] = d;
  47.              } 
  48.          } 
  49.     } 
  50.     public static void main(String args[]) {
  51.         Scanner cin = new Scanner(new BufferedInputStream(System.in));
  52.         while(cin.hasNext()) {
  53.             String s1 = cin.nextLine();
  54.             String s2 = cin.nextLine();
  55.             Main mm = new Main();
  56.             String[] ss =  s1.split(" ");
  57.             String[] rr = s2.split(" ");
  58.             mm.arrs = new char[ss.length];
  59.             for(int i=0;i<ss.length;i++) {
  60.                 mm.arrs[i] = ss[i].charAt(0);
  61.             }
  62.             mm.rules = new char[rr.length];
  63.             for(int i=0;i<rr.length;i++) {
  64.                 mm.rules[i] = rr[i].charAt(0);
  65.             }
  66.             mm.N = mm.arrs.length;
  67.             mm.Backtrack(0);
  68.             for(String abc:mm.set)
  69.                 System.out.println(abc);
  70.             System.out.println("");
  71.             mm.set.clear();
  72.         }
  73.     }
  74. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值