AOJ : 1227 - 77377

問題概要

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1227
携帯のボタンによるアルファベット入力の問題.
2~9 だけで構成された文字列が入力される. これは, どのボタンを押したかを表しているが, 何回ボタンを押しても, 1つの文字として表されている.


例えば,

  • "777"

という文字列は「7を3回押した」の意味ではなく, 「7のボタンにあたるアルファベットを3回入力した」という意味になる. そのため, "pqr"や"ppp"など, (4*4*4)通りの文字列を予想することができる.


入力の前半の辞書の単語しか打てないとするならば, どのような文章が打たれたと予想できるか, 出力する問題.

アルゴリズム

素直にDFSで解きましょう.
特に解説はありません.

プログラム

static HashMap<String,ArrayList<String>> map;
static ArrayList<ArrayList<String>> ans;

static void solve(int rem,String s,ArrayList<String> al){
  if(rem == 0){
    ans.add(al);
    return;
  }

  for(String key : map.keySet()){
    if(s.startsWith(key)){
      String ns = s.substring(key.length());

      for(String val : map.get(key)){
        ArrayList<String> nal = new ArrayList<String>(al);
        nal.add(val);
        solve(rem-key.length(),ns,nal);
      }
    }
  }
}

public static void main(String[] args){
  Scanner sc = new Scanner(System.in);
  int[] b = new int[128];
  b['a'] = b['b'] = b['c'] = 2;
  b['d'] = b['e'] = b['f'] = 3;
  b['g'] = b['h'] = b['i'] = 4;
  b['j'] = b['k'] = b['l'] = 5;
  b['m'] = b['n'] = b['o'] = 6;
  b['p'] = b['q'] = b['r'] = b['s'] = 7;
  b['t'] = b['u'] = b['v'] = 8;
  b['w'] = b['x'] = b['y'] = b['z'] = 9;

  while(true){
    int n = sc.nextInt();
    if(n == 0) break;

    map = new HashMap<String,ArrayList<String>>();

    for(int i=0;i<n;i++){
      String s = sc.next();
      String digit = "";
      for(char ch : s.toCharArray()){
        digit += b[ch];
      }
      if(!map.containsKey(digit)) map.put(digit,new ArrayList<String>());
      map.get(digit).add(s);
    }

    String s = sc.next();

    ans = new ArrayList<ArrayList<String>>();
    solve(s.length(),s,new ArrayList<String>());

    for(ArrayList<String> al : ans){
      System.out.println(al.toString().replaceAll("\\[|\\]|,","") + ".");
    }
    System.out.println("--");
  }
}