int n scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&m); solve(); }
for(int i=0;i<m;i++){ for(int j=0;j<m;j++){ scanf("%d",&map[i][j]); moveOKs[i][j]=true; } } int a,b; scanf("%d %d",&a,&b); moveOKs[a][b]=false;
//アーロンの移動 int maxCatch=0; int t; if(a==b) return deep; if(moveOKs[a][b]==false && stop==false) return myMax; moveOKs[a][b]=false; for(int i=0;i<m;i++){ if(map[a][i]==1){ t=searchB(i,b,deep,false); if(t>maxCatch){ maxCatch=t; } } } if(stop==false){ t=searchB(a,b,deep,true); if(t>maxCatch) maxCatch=t; } return maxCatch;
//キャッチできたらtrueを返す int minCatch=myMax; int t; if(a==b) retrun deep; if(moveOKs[a][b]==false && stop==false) return false; moveOKs[a][b]=false; for(int i=0;i<m;i++){ if(map[b][i]==1){ t=searchA(a,i,deep+1,false); if(t<minCatch) minCatch=t; } } if(stop==false){ t=searchA(a,b,deep+1,true); if(t<minCatch) minCatch=t; } return minCatch;
int n; scanf("%d",&n); while(n>0) { solve(n); scanf("%d",&n); }
//梯子の場合一番上まで昇ってからジャンプ //それを忘れずに探索すること for(int i=0;i<n;i++){ scanf("%d",&b1[i]); } for(int i=0;i<n;i++){ scanf("%d",&b2[i]); moves1[i]=moves2[i]=0; } for(int i=0;i<3;i++){ moves1[i]=moves2[i]=1; } upDown(b1,moves1,n); upDown(b2,moves2,n); newJumpCount=1;//ジャンプで新しい地点に到達したらインクリメント、これが0のままなら永遠にたどり着けない while(newJumpCount>0){ newJumpCount=0; if(moves1[n-1]>0 || moves2[n-1]>0){ if(moves1[n-1]>0 && moves2[n-1]>0){ printf("%d\n",std::min(moves1[n-1],moves2[n-1])); }else if(moves1[n-1]>0 && moves2[n-1]<1){ printf("%d\n",moves1[n-1]); }else if(moves2[n-1]>0 && moves1[n-1]<1){ printf("%d\n",moves2[n-1]); } return; }
for(int i=0;i<n;i++){ if(moves1[i]>0){ if(moves2[i]==0 || moves2[i+1]==0 || moves2[i+2]==0){ newJumpCount++; } moves2[i+0]=myMin(moves1[i]+1,moves2[i+0]); moves2[i+1]=myMin(moves1[i]+1,moves2[i+1]); moves2[i+2]=myMin(moves1[i]+1,moves2[i+2]); } } upDown(b2,moves2,n); for(int i=0;i<n;i++){ if(moves2[i]>0){ if(moves1[i]==0 || moves1[i+1]==0 || moves1[i+2]==0){ newJumpCount++; } moves1[i+0]=myMin(moves2[i]+1,moves1[i+0]); moves1[i+1]=myMin(moves2[i]+1,moves1[i+1]); moves1[i+2]=myMin(moves2[i]+1,moves1[i+2]); } } } printf("NA\n"); return ;
if(b>0){ return std::min(a,b); }else{ return a; }
//梯子を上る処理 bool upOK=false; int upMin; for(int i=0;i<n;i++){ if(b[i]==1 && moves[i]>0 && upOK==false){ upOK=true; upMin=moves[i]; moves[i]=-1; }else if(b[i]!=1 && upOK==true){ moves[i-1]=myMin(upMin,moves[i-1]); upOK=false; } if(upOK==true && moves[i]>0){ upMin=std::min(upMin,moves[i]); moves[i]=-1; } } //滑り降りる処理 bool downOK=false; int downMin; for(int i=n-1;i>=0;i--){ if(b[i]==2 && moves[i]>0 && downOK==false){ downMin=moves[i]; moves[i]=-1; downOK=true; }else if(b[i]!=2 && downOK==true){ moves[i]=myMin(downMin,moves[i]); downOK=false; } if(downOK==true && moves[i]>0){ downMin=std::min(downMin,moves[i]); moves[i]=-1; } }
int n; scanf("%d",&n); while(n>0) { scanf("%d",&n); }
//梯子の場合一番上まで昇ってからジャンプ //それを忘れずに探索すること for(int i=0;i<n;i++) scanf("%d",b1[i]); for(int i=0;i<n;i++) scanf("%d",b2[i]);
scanf("%s",cWorm); n=strlen(cWorm); while(cWorm[0]!='0' && n>1){ minTime=0; worms.clear(); nows.clear(); nexts.clear(); search(); if(minTime==timeMax){ printf("NA\n"); }else{ printf("%d\n",minTime); } scanf("%s",cWorm); n=strlen(cWorm); }
int colorCount=0;//同色のカウント char t=cWorm[0]; for(int i=0;i<n;i++){ if(t==cWorm[i]) colorCount++; else break; } return colorCount;
//幅優先探索で検索する。 //3^10≒60000なので何とかなる nows.insert(cWorm); worms.insert(cWorm);
if(rgbCount(std::string(cWorm))==n){minTime=0; return;} std::string worm,nextWorm; int changeCount=1; while(changeCount>0){ minTime++; changeCount=0; it=nows.begin(); nexts.clear(); while(it!=nows.end()){ worm=(*it); for(int i=0;i<n-1;i++){ if(worm[i]!=worm[i+1]){ nextWorm=changeColor(worm,i); if(worms.find(nextWorm)==worms.end()){ worms.insert(nextWorm); nexts.insert(nextWorm); changeCount++; if(rgbCount(nextWorm)==n) return; } } } it++; } nows.clear(); it=nexts.begin(); while(it!=nexts.end()){ nows.insert(*it); it++; } } minTime=timeMax; return ;
char t1,t2,t3; std::string nextworm=worm; t1=worm[p]; t2=worm[p+1]; if((t1=='r' && t2=='g') || (t1=='g' && t2=='r')){ nextworm[p]=nextworm[p+1]='b'; }else if((t1=='r' && t2=='b') || (t1=='b' && t2=='r')){ nextworm[p]=nextworm[p+1]='g'; }else if((t1=='g' && t2=='b') || (t1=='b' && t2=='g')){ nextworm[p]=nextworm[p+1]='r'; } return nextworm;
int n,m; scanf("%d %d",&n,&m); while(n!=0 || m!=0){ setmap(n,m); scanf("%d %d",&n,&m); }
for(int i=1;i<=m;i++){ costMap[i].clear(); timeMap[i].clear(); } int a,b,cost,time; for(int i=0;i<n;i++) { scanf("%d %d %d %d",&a,&b,&cost,&time); costMap[a][b]=cost; costMap[b][a]=cost; timeMap[a][b]=time; timeMap[b][a]=time; } int k; scanf("%d",&k); int p,q,r; for(int i=0;i<k;i++) { scanf("%d %d %d",&p,&q,&r); if(r==0){ searchMapCost(p,q,m,costMap); }else if(r==1){ searchMapCost(p,q,m,timeMap); } }
for(int i=1;i<=m;i++){ costs[i]=mymax; moveOKs[i]=true; } costs[s]=0; int min=mymax; int p; int key,v; for(int k=0;k<m+1;k++) { min=mymax; for(int i=1;i<=m;i++){ if(costs[i]<min && moveOKs[i]==true){ min=costs[i]; p=i; } } if(min==mymax) break; moveOKs[p]=false; nextHome=map[p].begin(); while(nextHome!=map[p].end()){ key=(*nextHome).first; v=(*nextHome).second; if(costs[p]+v<costs[key]) costs[key]=costs[p]+v; nextHome++; } } printf("%d\n",costs[g]);