UAPC 2011 B High & Low Cube

問題

日本語なので本文参照。
サイコロの展開図が与えられるのを読み取る問題。

方針

面倒だけどひたすら実装。

ソースコード

const char *face[]={
"#######",
"#.....#",
"#...|.#",
"#.....#",
"#...|.#",
"#..-..#",
"#######",

"#######",
"#..-..#",
"#...|.#",
"#..-..#",
"#.|...#",
"#..-..#",
"#######",

"#######",
"#..-..#",
"#...|.#",
"#..-..#",
"#...|.#",
"#..-..#",
"#######",

"#######",
"#.....#",
"#.|.|.#",
"#..-..#",
"#...|.#",
"#.....#",
"#######",

"#######",
"#..-..#",
"#.|...#",
"#..-..#",
"#...|.#",
"#..-..#",
"#######",

"#######",
"#..-..#",
"#.|...#",
"#..-..#",
"#.|.|.#",
"#..-..#",
"#######",

"#######",
"#..-..#",
"#...|.#",
"#.....#",
"#...|.#",
"#.....#",
"#######",

"#######",
"#..-..#",
"#.|.|.#",
"#..-..#",
"#.|.|.#",
"#..-..#",
"#######",

"#######",
"#..-..#",
"#.|.|.#",
"#..-..#",
"#...|.#",
"#..-..#",
"#######"
};
string in[60],net1[60],net2[60];

void mirror(vs &v){
  int h=v.size(), w=v[0].size();
  rep(i,h)rep(j,w/2)swap(v[i][j],v[i][w-j-1]);
}
void rot(vs &v){
  int h=v.size(), w=v[0].size();
  vs tmp=v;
  v=vector<string>(w,string(h,'.'));
  rep(i,w)rep(j,h){
    v[i][j]=tmp[w-j-1][i];
    if(v[i][j]=='|')v[i][j]='-';
    else if(v[i][j]=='-')v[i][j]='|';
  }
}
void inv(vs &v){
  int h=v.size(), w=v[0].size();
  rep(i,h/2)rep(j,w)swap(v[i][j],v[h-i-1][j]);
}
int getnum(vector<string> vs,int id){
  if(id==0)mirror(vs);
  if(id==1){mirror(vs);rep(i,3)rot(vs);}
  if(id==2)mirror(vs);
  if(id==3){mirror(vs);rot(vs);}
  if(id==4)mirror(vs);
  if(id==5)inv(vs),mirror(vs);
  
  rep(i,9){
    bool ok=1;
    rep(j,7)if(vs[j]!=face[i*7+j])ok=0;
    if(ok)return i+1;
  }
  assert(0);
}
void parse(int *ans,string in[60]){
  rep(i,6){
    int p=0;
    rep(j,21)if((p=in[j].find("#######"))!=in[j].npos){
      vs v;
      rep(k,7)v.pb(in[j+k].substr(p,7));
      rep(k,7)rep(l,7)in[j+k][p+l]='.';
      ans[i]=getnum(v,i);
      break;
    }
  }
}
int main(){
  while(cin>>in[0],in[0]!="0"){
    rep(i,20)cin>>in[i+1];
    rep(i,21)net1[i]=in[i].substr(0,28), net2[i]=in[i].substr(29);
    
    int enemy[6], me[6];
    parse(me,net1);
    parse(enemy,net2);
    int win=0, draw=0;
    rep(i,6)rep(j,6){
      win+=me[i]>enemy[j];
      draw+=me[i]==enemy[j];
    }
    cout<<(win*2>=(36-draw)?"HIGH":"LOW")<<endl;
  }
  return 0;
}