mukis['E']=0; mukis['N']=1; mukis['W']=2; mukis['S']=3; mukis[0]='E'; mukis[1]='N'; mukis[2]='W'; mukis[3]='S'; int w,h; scanf("%d %d",&w,&h); while(w!=0 || h!=0){ setMap(w,h); scanf("%d %d",&w,&h); }
char meiro[31][31]; char nextmeiro[31][31]; for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ scanf(" %c",&meiro[i][j]); nextmeiro[i][j]=meiro[i][j]; } } //迷路のサイズが小さいことを利用してセルオートマトンとして処理する。 char t; int count; int muki; int nx,ny; for(int k=0;k<181;k++) { count=0; for(int i=0;i<h;i++) { for(int j=0;j<w;j++) { t=meiro[i][j]; if(t=='E' || t=='N' || t=='W' || t=='S') { muki=mukis[t]+4; //printf("<%d>",muki); count++; for(int l=-1;l<3;l++) { nx=dxs[(muki+l)%4]+j; ny=dys[(muki+l)%4]+i; if(nx<0 || nx>=w || ny<0 || ny>=h) continue; if(meiro[ny][nx]=='.' || meiro[ny][nx]=='X') { //printf("/%d/",(muki+l)%4); meiro[i][j]=mukis[(muki+l)%4]; break; } } } } } if(count==0){ printf("%d\n",k); return ; } //printf("\n"); for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ //printf("%c",meiro[i][j]); //nextmeiro[i][j]=meiro[i][j]; } //printf("\n"); } int t; //scanf("%d",&t); for(int i=0;i<h;i++) { for(int j=0;j<w;j++) { if(meiro[i][j]=='.' || meiro[i][j]=='X') { for(int l=0;l<4;l++) { nx=dxs[l]+j; ny=dys[l]+i; if(nx<0 || nx>=w || ny<0 || ny>=h) continue; if(mukis.find(meiro[ny][nx])!=mukis.end()) { if((mukis[meiro[ny][nx]]+2)%4==l) { if(meiro[i][j]=='X') { nextmeiro[ny][nx]='.'; }else { nextmeiro[i][j]=meiro[ny][nx]; nextmeiro[ny][nx]='.'; break; } } } } } } } for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ //printf("%c",nextmeiro[i][j]); meiro[i][j]=nextmeiro[i][j]; } //printf("\n"); } } printf("NA\n");
int x,y;
int w,h; scanf("%d %d",&w,&h); while(w!=0 || h!=0){ setMap(w,h); scanf("%d %d",&w,&h); }
char t; for(int i=0;i<5;i++) counts[i]=0; for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ scanf(" %c",&t); if('0'<t && t<'6'){ t-='1'; ps[t][counts[t]].x=j; ps[t][counts[t]].y=i; counts[t]++; }else if(t=='S'){ sp.x=j; sp.y=i; }else if(t=='G'){ ep.x=j; ep.y=i; } } } int typeC=0; for(int i=0;i<5;i++){ if(counts[i]>0) typeC++; } //printf("\n"); if(typeC<4){ printf("NA\n"); return ; } int mymax=1000000000; ans=mymax; int tt; for(int k=0;k<5;k++){ for(int i=0;i<4;i++){ tt=(k+i+1)%5; for(int j=0;j<counts[tt];j++){ g[i][j]=mymax; } //printf("%d<%d>",counts[tt],tt); } //printf(")\n"); //printf("%d\n",k); saiki(0,(k+1)%5,k); //printf("\n\n"); } printf("%d %d\n",fNo,ans);
int t;
//printf("(no=%d ono=%d)\n",no,oldNo); if(deep==0){ for(int i=0;i<counts[no];i++){ g[deep][i]=abs(ps[no][i].x-sp.x)+abs(ps[no][i].y-sp.y); } saiki(deep+1,(no+1)%5,no%5); }else if(deep==4){ for(int i=0;i<counts[oldNo];i++){ t=abs(ps[oldNo][i].x-ep.x)+abs(ps[oldNo][i].y-ep.y)+g[deep-1][i]; if(ans>t){ ans=t; fNo=no+1; } } }else{ for(int i=0;i<counts[oldNo];i++){ for(int j=0;j<counts[no];j++){ t=abs(ps[oldNo][i].x-ps[no][j].x)+abs(ps[oldNo][i].y-ps[no][j].y)+g[deep-1][i]; //printf("<%d %d>",abs(ps[oldNo][i].x-ps[no][j].x)+abs(ps[oldNo][i].y-ps[no][j].y),g[deep-1][i]); g[deep][j]=g[deep][j]>t?t:g[deep][j]; } } saiki(deep+1,(no+1)%5,no%5); }
int sx,sy; int ex,ey; bool operator<(const point p)const{ if(sy!=p.sy) return sy<p.sy; if(sx!=p.sx) return sx<p.sx; return false; }
int n,m,k; scanf("%d %d %d",&n,&m,&k); while(n!=0 || m!=0 || k!=0){ setMap(n,m,k); scanf("%d %d %d",&n,&m,&k); }
unsigned int mod=1000000007; for(int i=0;i<=n+m;i++){ memo[i]=0; memo2[i]=0; } memo[1]=1; point p; point outPoint; std::set<point> warp; std::map<point,unsigned int> warpOut; std::set<point>::iterator it; for(int i=0;i<k;i++){ scanf("%d %d %d %d",&p.sx,&p.sy,&p.ex,&p.ey); warp.insert(p); outPoint.sx=p.ex; outPoint.sy=p.ey; warpOut[outPoint]=0; } for(int i=2;i<=n+m;i++){ for(int j=1;j<i;j++){ p.sx=i-j; p.sy=j; if(p.sx>n || p.sy>m ){ continue; } if(warpOut.find(p)!=warpOut.end()){ memo2[j]=warpOut[p]; }else{ memo2[j]=0; } it=warp.find(p); if(it==warp.end()){ //ワープポイントでないなら memo2[j]+=(memo[j-1]+memo[j])%mod; memo2[j]%=mod; //printf("%d ",memo2[j]); }else{ p=(*it); if(p.ex>n || p.ey>m) continue; outPoint.sx=p.ex; outPoint.sy=p.ey; warpOut[outPoint]+=(memo[j]+memo[j-1]+memo2[j])%mod; warpOut[outPoint]%=mod; memo2[j]=0; //printf("%d ",memo[j]+memo[j-1]+memo2[j]); } } //printf("\n"); for(int j=1;j<=i;j++){ if(j>m || i-j>n) continue; memo[j]=memo2[j]; } } printf("%d\n",memo[m]);
node* parentNode;//親のノード std::string name; std::vector<node> childNodes;//子のノード
int x,y; char t; scanf("%d %d",&x,&y); while(x!=0 || y!=0){ scanf("%c",&t); setTree(x,y); scanf("%d %d",&x,&y); }
char space[100]; int sCount=0,k,oldCount=0,t; node topNode; topNode.parentNode=&topNode; node nAdd; node* n1=&topNode; std::map<std::string,node*> nodes; for(int i=0;i<x;i++){ scanf("%[^\n]%*c",space); k=sCount=0; while(space[sCount]==' '){ sCount++; } while(space[k+sCount]!='\0'){ space[k]=space[k+sCount]; k++; } space[k]='\0'; nAdd.name=space; t=sCount-oldCount; if(t<0){ for(int i=0;i<-t+1;i++){ n1=n1->parentNode; } }else if(t==0){ n1=n1->parentNode; } nAdd.parentNode=n1; n1->childNodes.push_back(nAdd); n1=&n1->childNodes[n1->childNodes.size()-1]; nodes[n1->name]=n1; oldCount=sCount; } char name1[50],name2[50]; char tempCom[20]; std::string command; for(int i=0;i<y;i++){ scanf("%s",name1); command=""; for(int j=0;j<4;j++){ scanf("%s",tempCom); command+=tempCom; } scanf(" %[^.]",name2); char t; scanf("%c",&t); if(command=="isachildof"){ if(nodes[name1]->parentNode->name==name2){ printf("True\n"); }else{ printf("False\n"); } }else if(command=="istheparentof"){ if(nodes[name1]->name==nodes[name2]->parentNode->name){ printf("True\n"); }else{ printf("False\n"); } }else if(command=="isasiblingof"){ if(nodes[name1]->parentNode->name==nodes[name2]->parentNode->name){ printf("True\n"); }else{ printf("False\n"); } }else if(command=="isadescendantof"){ n1=nodes[name1]; bool ok=false; while(n1!=&topNode){ n1=n1->parentNode; if(n1->name==name2) ok=true; } if(ok==true){ printf("True\n"); }else{ printf("False\n"); } }else if(command=="isanancestorof"){ n1=nodes[name2]; bool ok=false; while(n1!=&topNode){ n1=n1->parentNode; if(n1->name==name1) ok=true; } if(ok==true){ printf("True\n"); }else{ printf("False\n"); } } }