PKU : 3050 - Hopscotch

問題概要

http://poj.org/problem?id=3050
5*5の数字が書かれたテーブルが与えられます.(数字はおそらく0〜9の1ケタ)
適当な位置から上下左右に移動して6ケタの数字を作るとき, 何種類の数字を作ることができるでしょう.

アルゴリズム

開始位置だけ決めて, そこから全探索で解けると思います.
DFSで実装しました.
O(5 * 5 * 4^6 * 重複をはぶくためのデータ構造のオーダ)


重複をはぶくためのデータ構造は, セットを使うといいと思います.
トライでやってみたら, タイムは半分ぐらい縮みました.

プログラム

string t[5][5];
set<string> ans;

int dx[] = {1,-1,0,0};
int dy[] = {0,0,1,-1};

void solve(int x,int y,int rem,string s){
  if(rem == 0){
    ans.insert(s);
    return;
  }

  rep(i,4){
    int nx = x + dx[i];
    int ny = y + dy[i];

    if(0 <= nx && nx < 5 && 0 <= ny && ny < 5){
      solve(nx,ny,rem-1,s+t[ny][nx]);
    }
  }
}

int main(void){
  rep(i,5){
    rep(j,5){
      cin>>t[i][j];
    }
  }
  rep(i,5){
    rep(j,5){
      solve(j,i,5,t[i][j]);
    }
  }
  cout<<ans.size()<<endl;
}