#2大意,通过矩形区域(m,n),区域是由0和1组成,0代表不能踩,1代表可以踩。从起点(0,0)->(m,n)。
#include <iostream>
#include <vector>
#include <cassert>
using namespace std;
//华为8月12机试
class Solution{
private:
int m, n;
int d[2][2] = {{2, 0}, {0, 2}};//方向控制,2分别代表步长和前进的两个方向,向下和向右
vector<vector<bool>> visited;
//
bool inArea(int x, int y)
{
return x >= 0 && x < m && y >= 0 && y < n;
}
bool dfs(const vector<vector<int>> &board, int x, int y)
{
//cout << "m = " << m << ", n = " << n << endl;
//cout << "x = " << x << ", y = " << y << endl;
if(((x == m-1) && (y == n-1)) && !visited[x][y])
{
//cout << "we arrived!" << endl;
return board[x][y] == 1;
}
visited[x][y] = true;
for(int i = 0; i < 2; i++){
int newx = x + d[i][0];
int newy = y + d[i][1];
if(inArea(newx, newy) && !visited[newx][newy] && (board[newx][newy] == 1) && dfs(board, newx, newy))
return true;
}
visited[x][y] = false;
return false;
}
public:
bool canArrive(vector<vector<int>> &board)
{
m = board.size();
assert(m > 0);
n = board[0].size();
visited = vector<vector<bool>>(m, vector<bool>(n, false));
if(dfs(board, 0, 0))
return true;
return false;
}
};
int main()
{
int b[5][7] = {{1,0,1,0,0,0,1}, {0,0,0,0,0,0,0}, {0,0,1,0,1,0,1},{1,0,0,1,0,0,0},{0,0,1,0,0,0,1}};
vector<vector<int>> board;
for(int i = 0; i < 5; i++)
board.push_back(vector<int>(b[i], b[i]+sizeof(b[i])/sizeof(int)));
/*
for(int i = 0; i < board.size(); i++){
for(int j = 0; j < board[0].size(); j++){
cout << board[i][j] << " ";
}
cout << endl;
}
*/
if(Solution().canArrive(board))
cout << "can arrive" << endl;
else
cout << "can not arrive" << endl;
return 0;
}
ps:测试用例有限,有改进的地方请联系,谢谢!