中级农民
- 积分
- 115
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-10-16
- 最后登录
- 1970-1-1
|
测了下貌似没问题。。。后面那四个helper应该还可以优化一下,懒得优化了。。。欢迎指正
假设机器人开始向上:
- #include <iostream>
- #include <vector>
- #include <unordered_map>
- #include <unordered_set>
- using namespace std;
- class Robot {
- public:
- Robot(vector<string>& grid, int i, int j) : grid(grid), i(i), j(j) {
-
- }
- bool Move() {
- if (i + di < 0 || i + di >= grid.size() || j + dj < 0 || j + dj >= grid[i].size() || grid[i + di][j + dj] == '+')
- return false;
- i += di;
- j += dj;
- return true;
- }
- // Robot will stay on the same cell after calling Turn*. k indicates how
- // many turns to perform.
- int ddi[4] = {0, 1, 0, -1};
- int ddj[4] = {1, 0, -1, 0};
- void TurnRight(int k) {
- int ii = 0;
- for (; ii < 4; ++ii) {
- if (ddi[ii] == di && ddj[ii] == dj)
- break;
- }
- int iii = (ii + k) % 4;
- di = ddi[iii];
- dj = ddj[iii];
- }
- void TurnLeft(int k) {
- int ii = 0;
- for(; ii < 4; ++ii) {
- if (ddi[ii] == di && ddj[ii] == dj)
- break;
- }
- int iii = (ii - k) % 4;
- di = ddi[iii];
- dj = ddj[iii];
- }
- // Clean the current cell.
- void Clean() {
- grid[i][j] = ' ';
- }
- private:
- vector<string>& grid;
- int i;
- int j;
- int di = 1;
- int dj = 0;
- };
- // after each move, recover the direction of robots
- bool moveLeft(Robot& r) {
- r.TurnRight(3);
- bool possible = r.Move();
- r.TurnRight(1);
- return possible;
- }
- bool moveRight(Robot& r) {
- r.TurnRight(1);
- bool possible = r.Move();
- r.TurnRight(3);
- return possible;
- }
- bool moveUp(Robot& r) {
- bool possible = r.Move();
- return possible;
- }
- bool moveDown(Robot& r) {
- r.TurnRight(2);
- bool possible = r.Move();
- r.TurnRight(2);
- return possible;
- }
- void helper1(Robot& r, unordered_map<int, unordered_set<int> >& visited, int i, int j) {
- // left, up, down
- if (visited.count(i) && visited[i].count(j))
- return;
- r.Clean();
- //r.print();
- visited[i].insert(j);
- if (moveLeft(r)) {
- helper1(r, visited, i, j - 1);
- moveRight(r);
- }
- if (moveUp(r)) {
- helper1(r, visited, i + 1, j);
- moveDown(r);
- }
- if (moveDown(r)) {
- helper1(r, visited, i - 1, j);
- moveUp(r);
- }
- return;
- }
- void helper2(Robot& r, unordered_map<int, unordered_set<int> >& visited, int i, int j) {
- // up left right
- if (visited.count(i) && visited[i].count(j))
- return;
- r.Clean();
- visited[i].insert(j);
- if (moveUp(r)) {
- helper2(r, visited, i + 1, j);
- moveDown(r);
- }
- if (moveLeft(r)) {
- helper2(r, visited, i, j - 1);
- moveRight(r);
- }
- if (moveRight(r)) {
- helper2(r, visited, i, j + 1);
- moveLeft(r);
- }
- return;
- }
- void helper3(Robot& r, unordered_map<int, unordered_set<int> >& visited, int i, int j) {
- // up right down
- if (visited.count(i) && visited[i].count(j))
- return;
- r.Clean();
- visited[i].insert(j);
- if (moveUp(r)) {
- helper3(r, visited, i + 1, j);
- moveDown(r);
- }
- if (moveRight(r)) {
- helper3(r, visited, i, j + 1);
- moveLeft(r);
- }
- if (moveDown(r)) {
- helper3(r, visited, i - 1, j);
- moveUp(r);
- }
- return;
- }
- void helper4(Robot& r, unordered_map<int, unordered_set<int> >& visited, int i, int j) {
- // left down right
- if (visited.count(i) && visited[i].count(j))
- return;
- r.Clean();
- visited[i].insert(j);
- if (moveLeft(r)) {
- helper4(r, visited, i, j - 1);
- moveRight(r);
- }
- if (moveDown(r)) {
- helper4(r, visited, i - 1, j);
- moveUp(r);
- }
- if (moveRight(r)) {
- helper4(r, visited, i, j + 1);
- moveLeft(r);
- }
- return;
- }
- void cleanAll(Robot& r) {
- unordered_map<int, unordered_set<int> > visited;
- helper1(r, visited, 0, 0);
- visited.clear();
- helper2(r, visited, 0, 0);
- visited.clear();
- helper3(r, visited, 0, 0);
- visited.clear();
- helper4(r, visited, 0, 0);
- }
- int main() {
- vector<string> layout({
- "++++++++++",
- "+........+",
- "+........+",
- "+.+......+",
- "++++.+++++",
- "+.....+",
- "+++++++"
- });
- Robot r(layout, 2, 4);
- cleanAll(r);
- for (auto s: layout)
- cout << s << endl;
- return 0;
- }
复制代码 |
|