ARC #005
A.
最後と最後以外で場合分けします。(最初の12文字一致で実装するのでも良さそうです。追記:ダメです)
int main(){ int n,ans = 0; string s; cin>>n; for(int i = 0; i < n-1; i++){ cin>>s; if(s=="TAKAHASHIKUN"||s=="Takahashikun"||s=="takahashikun")ans++; } cin>>s; if(s=="TAKAHASHIKUN."||s=="Takahashikun."||s=="takahashikun.")ans++; cout<<ans<<endl; return 0; }
B.
横にはみ出したら、横に反転して、縦にはみ出したら、縦に反転すると、題意を満たします。
反転する所はdx*=-1のようにしたほうが実装量が減ります。
int x,y,dx,dy; string d,g[9]; void init(){ x -= 1;y -= 1; if(d=="R"){ dx=1;dy=0; } if(d=="L"){ dx=-1;dy=0; } if(d=="U"){ dx=0;dy=-1; } if(d=="D"){ dx=0;dy=1; } if(d=="RU"){ dx=1;dy=-1; } if(d=="RD"){ dx=1;dy=1; } if(d=="LU"){ dx=-1;dy=-1; } if(d=="LD"){ dx=-1;dy=1; } } void solve(){ for(int i = 0; i < 4; i++){ cout<<g[y][x]; y+=dy;x+=dx; if(y<0){ dy=1; y=1; } if(x<0){ dx=1; x=1; } if(y>=9){ dy=-1; y=7; } if(x>=9){ dx=-1; x=7; } } cout<<endl; } int main(){ cin>>x>>y>>d; for(int i = 0; i < 9; i++)cin>>g[i]; init(); solve(); return 0; }
C.
壁を壊した回数を覚えておいて、幅優先探索します。
priority_queueを使ったほうが効率が良さそうなので(出来るだけ壁を壊さないほうが遠くまで行けるから)、priority_queueを使いました。
追記:ダイクストラ法になってました
#define mp make_pair #define fi first #define se second typedef pair<int,pair<int,int> > P; int h,w,sx,sy,g[500][500],dx[] = {1,0,-1,0},dy[] = {0,1,0,-1}; string s[500]; bool val(int y,int x){ return 0<=y&&0<=x&&y<h&&x<w; } int main(){ cin>>h>>w; for(int i = 0; i < h; i++)cin>>s[i]; for(int i = 0; i < h; i++){ for(int j = 0; j < w; j++){ if(s[i][j]=='s'){ sx = j; sy = i; } } } priority_queue<P> q; q.push(mp(3,mp(sy,sx))); while(!q.empty()){ P p = q.top(); q.pop(); int rank = p.fi,py = p.se.fi,px = p.se.se; for(int i = 0; i < 4; i++){ int y = py+dy[i],x = px+dx[i]; if(val(y,x)){ if(s[y][x]=='.'&&g[y][x]<rank){ g[y][x] = rank; q.push(mp(rank,mp(y,x))); } if(s[y][x]=='#'&&g[y][x]<rank-1){ g[y][x] = rank; q.push(mp(rank-1,mp(y,x))); } if(s[y][x]=='g'){ cout<<"YES"<<endl; return 0; } } } } cout<<"NO"<<endl; return 0; }
D.
足し算しない場合は、出てきた数字をすべて使えるか調べるだけです。
足し算する場合は分かりません(入力が弱いらしいので、嘘枝刈り+埋め込みでも通せるらしいです)
32ndでした