SRM 453.5 DIV1 Easy - MazeMaker

問題


http://community.topcoder.com/stat?c=problem_statement&pm=10451&rd=14174

迷路とプレイヤーが1ターンで移動できる方向のマスが与えられる。
このとき、プレイヤーがゴールできない位置、もしくはゴールできるときは
一番遠い位置にゴールを置きたい。

ゴールできない位置におけるときはー1を、そうでないときは
もっとも遠いターン数を求める。

解き方


幅優先探索で全探索すればよい。
幅優先探索なのでセルの値の更新は一度だけでよい。

コード


class MazeMaker {

public: int longestPath(vector<string> maze, int startRow, int startCol, vector<int> moveRow, vector<int> moveCol) {
int h=maze.size(),w=maze[0].size(),n=moveRow.size();
int used[h][w];

memset(used,-1,sizeof(used));
queue<pair<int,int> > q;
q.push(make_pair(startRow,startCol));
used[startRow][startCol]=0;

while(!q.empty()){
int r=q.front().first;
int c=q.front().second;
int turn=used[r][c];
q.pop();

FORE(i,0,n){
int nr=r+moveRow[i],nc=c+moveCol[i];
if(0<=nr && nr<h && 0<=nc && nc<w && maze[nr][nc]!='X' && used[nr][nc]==-1){
q.push(make_pair(nr,nc));
used[nr][nc]=turn+1;
}
}
}

int ret=0;
FORE(i,0,h)FORE(j,0,w)if(maze[i][j]=='.'){
if(used[i][j]==-1)return -1;
ret=max(ret,used[i][j]);
}

return ret;
}

};

Share this

Related Posts

Previous
Next Post »