微软2016实习生笔试--第三题Demo Day
来源:互联网 发布:女装淘宝店铺简介 编辑:程序博客网 时间:2024/06/09 13:57
微软2016校园招聘4月在线笔试题解(三)
Sat 09 April 2016 by ictlxb Filed under C/CPP Tags cpp algorithm hihocoderIf all you have is a hammer, everything looks like a nail. ---Maslow
C. Demo Day
Problem
时间限制:10000ms 单点时限:1000ms 内存限制:256MB
描述
You work as an intern at a robotics startup. Today is your company's demo day. During the demo your company's robot will be put in a maze and without any information about the maze, it should be able to find a way out.
The maze consists of N * M grids. Each grid is either empty(represented by '.') or blocked by an obstacle(represented by 'b'). The robot will be release at the top left corner and the exit is at the bottom right corner.
Unfortunately some sensors on the robot go crazy just before the demo starts. As a result, the robot can only repeats two operations alternatively: keep moving to the right until it can't and keep moving to the bottom until it can't. At the beginning, the robot keeps moving to the right.
rrrrbb.. ...r.... ====> The robot route with broken sensors is marked by 'r'. ...rrb.....bb...
While the FTEs(full-time employees) are busy working on the sensors, you try to save the demo day by rearranging the maze in such a way that even with the broken sensors the robot can reach the exit successfully. You can change a grid from empty to blocked and vice versa. So as not to arouse suspision, you want to change as few grids as possible. What is the mininum number?
输入
Line 1: N, M.
Line 2-N+1: the N * M maze.
For 20% of the data, N * M <= 16.
For 50% of the data, 1 <= N, M <= 8.
For 100% of the data, 1<= N, M <= 100.
输出
The minimum number of grids to be changed.
样例输入
4 8....bb...............b.....bb...
样例输出
1
Analysis
想我这种菜鸟,估计也提供不了什么好的思考问题的方法。
我只会一点简单的DP,看到这个题也就是向DP靠,根本没考虑有没有重叠子问题,有没有最优子结构。(这都是个啥?)
糙快猛,列方程:
dp[i][j][k]
表示robot跑到i
行j
列目前移动方向为k
时,所需要的最小的flip。其中0 <= i <= N
,0 <= j <= M
,k = right/down
// j-1 j// i-1 r` // |// i r``-- ?--> right//// i+1 ?dp[i][j][right] = min(dp[i][j-1][right], dp[i-1][j][down] + (i+1 < n && maze[i+1][j] != 'b')) + (maze[i][j] == 'b');// j-1 j j+1// i-1 r` // |// i r``-- ? ?// |// v// downdp[i][j][down] = min(dp[i-1][j][down], dp[i][j-1][right] + (j+1 < m && maze[i][j+1] != 'b')) + (maze[i][j] == 'b');
有了这些结论,代码比较容易写出来了。
#include <iostream>#include <vector>#include <algorithm>using namespace std;int solve(vector<vector<char> > &maze){const int n = maze.size();const int m = maze.front().size();vector<vector<vector<int> > > dp(n, vector<vector<int> >(m, vector<int>(2)));dp[0][0][0] = maze[0][0] == 'b';dp[0][0][1] = dp[0][0][0] + (m > 1 && maze[0][1] != 'b');for(int i = 1; i < n; i++){dp[i][0][1] = min(dp[i-1][0][1], dp[i-1][0][0] + (m > 1 && maze[i-1][1] != 'b')) + (maze[i][0] == 'b');dp[i][0][0] = dp[i][0][1] + (i+1 < n && maze[i+1][0] != 'b');}for(int i = 1; i < m; i++){dp[0][i][0] = min(dp[0][i-1][0], dp[0][i-1][1] + (n > 1 && maze[1][i-1] != 'b')) + (maze[0][i] == 'b');dp[0][i][1] = dp[0][i][0] + (i+1 < m && maze[0][i+1] != 'b');}for(int i = 1; i < n; i++){for(int j = 1; j < m; j++){dp[i][j][0] = min(dp[i][j-1][0], dp[i-1][j][1] + (i+1 < n && maze[i+1][j] != 'b')) + (maze[i][j] == 'b');dp[i][j][1] = min(dp[i-1][j][1], dp[i][j-1][0] + (j+1 < m && maze[i][j+1] != 'b')) + (maze[i][j] == 'b');}}return min(dp[n-1][m-1][0], dp[n-1][m-1][1]);}int main(){int n, m;while(cin >> n >> m){vector<vector<char> > maze(n, vector<char>(m));for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)cin >> maze[i][j];cout << solve(maze) <<endl;}return 0;}
- 微软2016实习生笔试--第三题Demo Day
- 微软2016年4月实习生笔试第三题-Demo Day题解
- 微软笔试题3 Demo Day
- 微软笔试题3:Demo Day
- 微软笔试3 Demo Day
- 微软2016实习生笔试--第一题Font Size
- 微软2016实习生笔试--第二题403 Forbidden
- hihocoder 1290 -- 微软2016校园招聘4月在线笔试-3-Demo Day
- 微软2016校园招聘4月在线笔试 hihocoder 1290 Demo Day (dp)
- Demo Day (微软2016校园招聘4月在线笔试)
- 微软201604笔试题目3 Demo Day 动态规划解法
- 2012微软暑期实习生笔试题
- 2012微软暑期实习生笔试题
- 微软2013暑假实习生笔试题
- 微软2013暑期实习生笔试题错误
- 微软2013暑假实习生笔试题
- 微软2013暑假实习生笔试题
- 2013.04微软暑期实习生招聘笔试题
- C#基础
- 视频压缩编解码标准综述
- PHP中使用CURL实现GET和POST请求
- xp下调试堆溢出(下)--利用快表
- 在 windows 环境下部署redislive监控redis
- 微软2016实习生笔试--第三题Demo Day
- js笔记4-事件基础
- jdk安装详解
- AndroidStudio完美解决"Activity使用Handler时出现警告信息"的问题
- Android textview 文字中间加上图片
- 多线程面试必须掌握的
- 集群管理脚本
- kafka单节点安装和测试
- 外键约束