机试

#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:测试用例有限,有改进的地方请联系,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值