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; }