zoj 1004
1. 枚举可能出现的堆进出序列
2. 测试序列是否满足要求
1 import java.util.Scanner; 2 3 public class Main { 4 static boolean next(char[] arr) { 5 int c = 0; 6 int p = arr.length - 1; 7 8 while (p > 0) { 9 if (arr[p] == 'i') { 10 if (p < arr.length - 2 && arr[p + 2] == 'o') { 11 arr[p] = 'o'; 12 arr[p + 1] = 'i'; 13 p++; 14 while (++p < arr.length) { 15 if (c > 0) { 16 arr[p] = 'i'; 17 c--; 18 } else { 19 arr[p] = 'o'; 20 } 21 } 22 return true; 23 } else { 24 c++; 25 } 26 } 27 p--; 28 } 29 30 return false; 31 32 } 33 34 static boolean check(char[] str1, char[] str2, char[] arr) { 35 char[] stack = new char[str1.length]; 36 int p = 0; 37 int cstr = 0, ctmp = 0; 38 char[] tmp = new char[str1.length]; 39 for (int i = 0; i < arr.length; i++) { 40 if (arr[i] == 'i') { 41 stack[p++] = str1[cstr++]; 42 } else { 43 tmp[ctmp++] = stack[--p]; 44 } 45 } 46 for (int i = 0; i < tmp.length; i++) { 47 if (tmp[i] != str2[i]) 48 return false; 49 } 50 return true; 51 } 52 53 public static void main(String[] args) { 54 55 Scanner sc = new Scanner(System.in); 56 while (sc.hasNext()) { 57 char[] str1 = sc.next().toCharArray(); 58 char[] str2 = sc.next().toCharArray(); 59 int len = str1.length; 60 char[] arr = new char[len * 2]; 61 for (int i = 0; i < str1.length; i++) { 62 arr[i] = 'i'; 63 } 64 for (int i = str1.length; i < str1.length * 2; i++) { 65 arr[i] = 'o'; 66 } 67 System.out.println('['); 68 do { 69 70 if (check(str1, str2, arr)) { 71 String tmp = ""; 72 for (int i = 0; i < arr.length; i++) { 73 tmp += arr[i] + " "; 74 } 75 System.out.println(tmp); 76 77 } 78 } while (next(arr)); 79 System.out.println(']'); 80 } 81 } 82 }