SRM651参加しました。…が今回コンテストに不具合があったらしく、年明けコンテスト同様unratedになりました。
unrated通知がきてからも、一応コンテスト自体は動いていたようですが、私は手を止めてしまったので、通知が来るまでの分だけ貼っておきます。
またしても、unrated コンテストだったうえに、そこで止めてしまったので実質250しか通せていませんでした。
こうしてまとめてみると、unratedで止めたと言っても、Mediumも通せるか怪しい感じで結構今回ボロボロでした。
安定度が前よりも落ちている気がするので、ちゃんと解き直して治しておかないと…
解き直ししたら追記、もしくは別記事に書きます。
250 : RobotOnMoonEasy
問題概要
以下の命令を受け付ける月面探査ロボットがあり、ロボットの初期位置(board配列内の’S’)や障害物の情報が配列boardで与えられる。
- U : board上の上に移動する
- D : board上の下に移動する
- L : board上の左に移動する
- R : board上の右に移動する
ただし、移動先に障害物(board配列では’#’表記)がある場合、移動せずに次の命令に進める。board外にロボットが出ると壊れてしまう。
ロボットへの命令が文字列Sで与えられるので、その命令を処理した際、ロボットが壊れているか否かを判定する。
解法
この問題は、単純に命令をシュミレーションしていき、その課程あるいは結果でロボットが場外に出ていないか否かを判定するだけでOKです。ただ、障害物の処理やロボットの初期状態がboard上の表記で与えられるので、その処理が少々注意が必要です。
コード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class RobotOnMoonEasy { | |
public: | |
string isSafeCommand(vector<string> board, string S) { | |
int x,y; | |
for (int i=0; i<board.size(); i++) { | |
for (int j=0;j<board[i].size(); j++) { | |
if(board[i][j]=='S') | |
{ | |
x=j; | |
y=i; | |
board[i][j]=='.'; | |
break; | |
} | |
} | |
} | |
int dx[]={-1,1,0,0}; | |
int dy[]={0,0,-1,1}; | |
string move="UDLR"; | |
for(int i=0;i<S.size();i++) | |
{ | |
for(int j=0;j<4;j++) | |
{ | |
if(move[j]==S[i]) | |
{ | |
int nx=x+dx[j]; | |
int ny=y+dy[j]; | |
if(nx<0 ||nx>=board.size() || | |
ny<0 || ny>=board[x].size()) | |
return "Dead"; | |
if(board[nx][ny]=='.') | |
{ | |
x+=dx[j]; | |
y+=dy[j]; | |
} | |
break; | |
} | |
} | |
} | |
return "Alive"; | |
} | |
}; |
500 : FoxAndSouvenirTheNext
問題概要
整数の配列valueが与えられる。この配列から、合計が同じかつ、整数の個数が同じである2つの集合に分けられるか否かを判定する。
解法
解法考えている途中でunrated通知がきたので、解ききれませんでした。
後日practiceで解けたら追記します。
1000 : FoxConnection4
問題開く前にunrated通知がきたので、こちらもmid同様後日practiceで解けたら追記します。