Depth-First Search (II)
1. Generating Permutations
Here is a class that can generate all possible k-permutations from 0 through n-1:
1 import java.util.*; 2 3 public class Permutation { 4 public static int [] combArr; 5 public static int [] permArr; 6 7 public static void genPerm(int pos,int k,int visit) { 8 if (pos==k) { 9 // Print the solution: 10 for (int i=0;i<k-1;i++) { 11 System.out.print(permArr[i]+" "); 12 } 13 System.out.print(permArr[k-1]+"\n"); 14 return; 15 } 16 int test = 1; 17 for (int b=0;b<k;b++){ 18 if ((test&visit)==0){ 19 permArr[pos] = combArr[b]; 20 genPerm(pos+1,k,visit|test); 21 } 22 test <<= 1; 23 } 24 } 25 public static void genComb(int pos,int n,int k) { 26 if (pos==k) { 27 // Generate the permutations: 28 genPerm(0,k,0); 29 return; 30 } 31 for (int v=combArr[pos-1]+1;v<n;v++){ 32 combArr[pos] = v; 33 genComb(pos+1,n,k); 34 } 35 } 36 public static void main(String[] args) { 37 Scanner in = new Scanner(System.in); 38 int n = in.nextInt(); 39 int k = in.nextInt(); 40 in.close(); 41 combArr = new int [k]; 42 permArr = new int [k]; 43 for (int v=0;v<n;v++){ 44 combArr[0] = v; 45 genComb(1,n,k); 46 } 47 System.out.println(); 48 } 49 }
The program above was written when I took up Java in the summer of 2014.
2. N-Queen Problem
This is my solution to the USACO training problem "checker":
1 import java.io.*; 2 import java.util.*; 3 4 public class checker { 5 public static BufferedReader input; 6 public static PrintWriter output; 7 public static int val, size; 8 public static int [] state; 9 10 public static void dfs(int depth,int inval,int left,int right) { 11 if (depth==size) { 12 if (++val<4) { 13 // print one of the first three solutions: 14 for (int i=0;i<size-1;i++) { 15 output.print(state[i]+" "); 16 } 17 output.println(state[size-1]); 18 } 19 return; 20 } 21 int pos = (inval|left|right); 22 for (int i=0;i<size;i++) { 23 if ((pos&(1<<i))==0) { 24 int lt = ((left|(1<<i))<<1); 25 int rt = ((right|(1<<i))>>1); 26 state[depth] = i+1; 27 dfs(depth+1,inval|(1<<i),lt,rt); 28 } 29 } 30 } 31 public static void solve() { 32 for (int i=0;i<size;i++) { 33 int inval = (1<<i); 34 state[0] = i+1; 35 dfs(1,inval, (inval<<1),(inval>>1)); 36 } 37 } 38 public static void main(String[] args) throws IOException { 39 input = new BufferedReader(new FileReader("checker.in")); 40 size = Integer.parseInt(input.readLine()); 41 input.close(); 42 state = new int [size]; 43 solve(); 44 output = new PrintWriter(new FileWriter("checker.out")); 45 output.println(val); 46 output.close(); 47 } 48 }
3. Party Lamps
This is my solution to the USACO training problem "lamps":
1 import java.io.*; 2 import java.util.*; 3 4 public class lamps { 5 public static BufferedReader input; 6 public static PrintWriter output; 7 public static boolean [] list; 8 public static int num,cnt,open,closed; 9 10 public static int turn(int state,int mode) { 11 switch (mode) { 12 case 0: state ^= 63; break; 13 case 1: state ^= 21; break; 14 case 2: state ^= 42; break; 15 case 3: state ^= 9; 16 } 17 return state; 18 } 19 public static boolean test(int state) { 20 for (int i=0;i<6;i++) { 21 if ((open&(1<<i))>0 && (state&(1<<i))==0) { 22 return false; 23 } else if ((closed&(1<<i))>0 && (state&(1<<i))>0) { 24 return false; 25 } 26 } 27 return true; 28 } 29 public static int inv(int state) { 30 int val = 0; 31 for (int i=0;i<6;i++) { 32 val <<= 1; 33 val += (state&1); 34 state >>= 1; 35 } 36 return val; 37 } 38 public static void dfs(int depth,int state,int op) { 39 if (depth==4) { 40 if (test(state) && op%2==cnt%2 && op<=cnt) { 41 list[inv(state)] = true; 42 } 43 return; 44 } 45 dfs(depth+1,turn(state,depth),op+1); 46 dfs(depth+1,state,op); 47 } 48 public static void show(int state) { 49 state = inv(state); 50 for (int i=0;i<num;i++) { 51 if ((state&(1<<(i%6)))>0) { 52 output.print(1); 53 } else { 54 output.print(0); 55 } 56 } 57 output.println(); 58 } 59 public static void main(String[] args) throws IOException{ 60 // Obtain the Input: 61 input = new BufferedReader(new FileReader("lamps.in")); 62 String line = input.readLine(); // first line of input 63 num = Integer.parseInt(line); 64 line = input.readLine(); // second line of input 65 cnt = Integer.parseInt(line); 66 line = input.readLine(); // third line of input 67 StringTokenizer str = new StringTokenizer(line); 68 int idx = Integer.parseInt(str.nextToken())-1; 69 while (idx>=0) { 70 open |= (1<<(idx%6)); 71 idx = Integer.parseInt(str.nextToken())-1; 72 } 73 line = input.readLine(); // fourth line of input 74 str = new StringTokenizer(line); 75 idx = Integer.parseInt(str.nextToken())-1; 76 while (idx>=0) { 77 closed |= (1<<(idx%6)); 78 idx = Integer.parseInt(str.nextToken())-1; 79 } 80 input.close(); 81 // Solve the Problem: 82 list = new boolean[64]; 83 dfs(0,63,0); 84 boolean flag = false; 85 for (int i=0;i<64;i++) { 86 if (list[i]) { 87 flag = true; 88 show(i); 89 } 90 } 91 // Phrase the Output: 92 output = new PrintWriter(new FileWriter("lamps.out")); 93 if (!flag) { 94 output.println("IMPOSSIBLE"); 95 } 96 output.close(); 97 } 98 }