#include #include #include #include using namespace std; #define MAXDIM 25 #define MAX 3000000 #define mp make_pair #define FOR(q,n) for(int q=0;q<(int)n;q++) typedef pair PII; int data[MAX]; int d; int dim[MAXDIM]; char ss[MAX]; int theseus; int minotaur; int sword; queue fronta; int used[MAX]; int dsize; void readinput(int d,int krat,int plus){ // printf("read input %d %d %d \n",d,krat,plus); if (d>0) { FOR(q,dim[d]) readinput(d-1,krat*dim[d],krat*q+plus); return; }; scanf("%s\n",ss); FOR(q,dim[0]) { int p=q*krat+plus; if (ss[q]=='T') {theseus=p;}; if (ss[q]=='S') {sword=p;}; if (ss[q]=='M') {minotaur=p;}; data[p]=(ss[q]!='#'); // printf("%d -> %d \n",p,data[p]); // printf("%c",ss[q]); } // printf("<<-\n"); } int init(){ scanf("%d\n",&d); dsize=1; FOR(q,d) {scanf("%d",&dim[q]); dsize*=dim[q]; } FOR(q,dsize) data[q]=0; if (d==0) return 0; theseus=minotaur=sword=-1; readinput(d-1,1,0); if (theseus<0) printf("BUG\n"); if (sword<0) printf("BUG\n"); if (minotaur<0) printf("BUG\n"); return 1; } vector tovector(int pos){ vector result; // printf("%d to vector ",pos); for (int q=d-1;q>=0;q--) { result.push_back(pos % dim[q]); pos/=dim[q]; } reverse(result.begin(),result.end()); // FOR(q,d) printf("%d ",result[q]); // printf("\n"); return result; } int toint(vector v){ //FOR(q,d) printf("%d ",v[q]); int res=0; for(int q=0;q tmp=tovector(pos); //printf("try %d %d \n",cnt,pos); FOR(q,d) { if (tmp[q]>0) { tmp[q]--; uloz(toint(tmp),cnt); tmp[q]++; } if (tmp[q]