解いた問題のソースコードと解説など。


SRM 417 Div1 Medium CubeNets

問題

1x1x1のサイズの立方体の展開図が文字列として与えられる。'#'はそこが1x1のサイズの面であることを表し、'.'は面ではないことを表す。
この展開図は正しい展開図であるとは限らない。そこで文字列が与えられた時、正しい展開図となっているかを返せ。

やりかた

回転と鏡映を考慮しない場合、立方体の展開図は11種類あるのでそれを予めリストアップしておいて、与えられた展開図を回転・鏡映してこの11種類のうちのどれかと一回でも一致したら正しい、という力技をした。

以下ソース。

class CubeNets {
public:
  vector <string> rotate(vector<string> s){
    int N = s.size(), M = s[0].size();
    vector<string> r(M);
    for(int j = 0; j < M; j++)
      for(int i = N - 1; i >= 0; i--)
	r[j] += s[i][j];
    return r;
  }
  vector<string> mirror(vector<string> s){
    for(int i = 0; i < s.size(); i++)
      reverse(ALL(s[i]));
    return s;
  }
  bool coin(vector<string> s, vector<string> t){
    int dH = s.size() - t.size();
    int dW = s[0].size() - t[0].size();
    for(int i = 0; i <= dH; i++){
      for(int j = 0; j <= dW; j++){
	bool match = true;
	for(int y = 0; y < t.size(); y++)
	  for(int x = 0; x < t[0].size(); x++)
	    if(s[i + y][j + x] != t[y][x]) match = false;
	if(match) return true;
      }
    }
    return false;
  }
  string isCubeNet(vector <string> figure) {
    vector<string> nets[11];
    nets[0] = {"#...",
	       "####",
	       "#..."};
    nets[1] = {"#...",
	       "####",
	       ".#.."};
    nets[2] = {"#...",
	       "####",
	       "..#."};
    nets[3] = {"#...",
	       "####",
	       "...#"};
    nets[4] = {".#..",
	       "####",
	       ".#.."};
    nets[5] = {".#..",
	       "####",
	       "..#."};
    nets[6] = {"###..",
	       "..###"};
    nets[7] = {"##..",
	       ".###",
	       ".#.."};
    nets[8] = {"##..",
	       ".###",
	       "..#."};
    nets[9] = {"##..",
	       ".###",
	       "...#"};
    nets[10] = {"##..",
		".##.",
		"..##"};
    
    for(int i = 0; i < 11; i++){
      vector<string> t = figure;
      for(int j = 0; j < 4; j++){
	t = rotate(t);
	if(coin(t, nets[i])) return "YES";
      }
      t = mirror(t);
      for(int j = 0; j < 4; j++){
	t = rotate(t);
	if(coin(t, nets[i])) return "YES";
      }
    }
    return "NO";
  }
};
Get up! 明日のSUPER ST@R!