2458 Rigging the Bovine Election
問題概要
5x5のグリッドにH,Jが書かれている。
このグリッドの縦または横に連続した大きさ7の部分で、Jの数がHの数より多いものは何通りあるか。
解法
深さ優先探索して全部数えればよい。
一度出現した局面は覚えて二度以上探索しないようにする。
局面は、マスが25しかないので、ビットで表現して整数型に収まる。
(下のコードではうっかりlong longを使ったがintでおk)
ソースコード
int ans,dx[]={-1,0,1,0},dy[]={0,-1,0,1}; char in[5][7]; set<ll> S; void rec(ll s,int H,int J){ if(S.count(s))return; S.insert(s); if(H+J==7){ if(H<4)ans++; return; } rep(i,5)rep(j,5)if(s&1<<i*5+j)rep(d,4) { int y=i+dy[d],x=j+dx[d],nh=H,nj=J; if(y<0||x<0||y>4||x>4)continue; if(in[y][x]=='H')nh++; if(in[y][x]=='J')nj++; if(nh<4)rec(s|1<<y*5+x,nh,nj); } } int main(){ rep(i,5)gets(in[i]); rep(i,5)rep(j,5)rec(1<<i*5+j,in[i][j]=='H',in[i][j]=='J'); printf("%d\n",ans); return 0; }