Advertisement
Guest User

A recursive backtracking problem

a guest
Jul 8th, 2010
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.39 KB | None | 0 0
  1. import java.math.BigInteger;
  2. import java.text.MessageFormat;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Collections;
  6. import java.util.List;
  7. import java.util.Random;
  8. import java.util.Set;
  9. import java.util.TreeSet;
  10.  
  11. public class SO3206795 {
  12.  
  13.     private static long ct;
  14.     private static long time    = System.currentTimeMillis();
  15.  
  16.     private static List<String[]> allPossibleWords(final Set<String> words, final String[] chain) {
  17.         final List<String> usedWords = Arrays.asList(chain);
  18.         final int offset = usedWords.lastIndexOf(null);
  19.         List<String[]> wordsList;
  20.         if (offset < 0) {
  21.             wordsList = Collections.singletonList(chain);
  22.             logCreated();
  23.         } else {
  24.             wordsList = new ArrayList<String[]>();
  25.             for (final String word : words) {
  26.                 if (!usedWords.contains(word)&&(offset==chain.length-1||isLegalNeighbor(word,usedWords.get(offset+1)))) {
  27.                     final String[] copy = Arrays.copyOf(chain, chain.length);
  28.                     copy[offset] = word;
  29.                     wordsList.addAll(allPossibleWords(words, copy));
  30.                 }
  31.             }
  32.         }
  33.         return wordsList;
  34.     }
  35.     private static List<String[]> getChains(final Set<String> words, final int length) {
  36.         final List<String[]> tmpChain = new ArrayList<String[]>();
  37.         final String[] chain = new String[length];
  38.         tmpChain.addAll(allPossibleWords(words, chain));
  39.         return tmpChain;
  40.     }
  41.  
  42.     private static Set<String> getWords(final int numberOfWords, final int wordLength) {
  43.         final Set<String> set=new TreeSet<String>();
  44.         final Random r = new Random();
  45.         while(set.size()<numberOfWords){
  46.             final char[] ch = new char[wordLength];
  47.             for (int i = 0; i < ch.length; i++) {
  48.                 ch[i]=(char) (65+r.nextInt(26));
  49.             }
  50.             set.add(new String(ch));
  51.         }
  52.         return set;
  53.     }
  54.  
  55.     private static boolean isLegalNeighbor(final String left, final String right) {
  56.         return left.charAt(left.length()-1)==right.charAt(0);
  57.     }
  58.  
  59.  
  60.     private static void logCreated() {
  61.         if (++ct % 10000 == 0) {
  62.             final long oldTime = time;
  63.             time = System.currentTimeMillis();
  64.             System.out.println("Created " + ct + " chains, duration: " + (time - oldTime));
  65.         }
  66.     }
  67.  
  68.     public static void main(final String[] args) {
  69.         String[] usedArgs = args;
  70.         if (args.length == 1 && args[0].matches(".*\\D.*")) {
  71.             usedArgs = args[0].split("\\D+");
  72.         }
  73.         ;
  74.         final int[] values = { 10, 3, 5 };
  75.         for (int i = 0; i < usedArgs.length && i < values.length; i++) {
  76.             values[i] = Integer.parseInt(usedArgs[i]);
  77.         }
  78.         final SO3206795 thing = new SO3206795(values[0], values[1], values[2]);
  79.         for (final String[] chain : thing.chains) {
  80.             System.out.println(Arrays.toString(chain));
  81.         }
  82.     }
  83.  
  84.     private static void printInfo(final int numberOfWords, final int wordLength, final int chainLength) {
  85.         BigInteger words = BigInteger.valueOf(numberOfWords);
  86.         for (int i = 1; i < chainLength; i++) {
  87.             words = words.multiply(BigInteger.valueOf(numberOfWords - i));
  88.         }
  89.  
  90.         System.out
  91.         .println(MessageFormat
  92.             .format(
  93.                 "Creating {0} words of length {1}.\nCreating all possible chains of {2} words.\nThat''s {3} chains in total",
  94.                 numberOfWords, wordLength, chainLength, words.toString()));
  95.     }
  96.  
  97.     Set<String>     words;
  98.  
  99.     List<String[]>  chains;
  100.     public SO3206795(final int numberOfWords, final int wordLength, final int chainLength) {
  101.  
  102.         printInfo(numberOfWords, wordLength, chainLength);
  103.         this.words = getWords(numberOfWords, wordLength);
  104.         this.chains = getChains(this.words, chainLength);
  105.     }
  106.  
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement