机器人走格子

    技术2023-06-06  89

    地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

    dfs:

    class Solution { public: int sum(int i, int j){ int count = 0; while(i > 0) { count = count + i%10; i = i/10; } while(j > 0) { count = count + j%10; j = j/10; } return count; } int num = 0; int dir[5] = {1, 0, -1, 0, 1}; void dfs(int *&m, int threshold, int rows, int cols, int i, int j){ if(i < 0 || i >= rows || j < 0 || j >= cols || sum(i, j) > threshold || m[i*cols+j] == 1) return; num++; m[i*cols+j] = 1; for(int k = 0; k < 4; k++) dfs(m, threshold, rows, cols, i+dir[k], j+dir[k+1]); } int movingCount(int threshold, int rows, int cols) { int *matrix = new int[rows*cols]; for(int i = 0; i < rows*cols; i++) matrix[i] = 0; dfs(matrix, threshold, rows, cols, 0, 0); return num; } };

    bfs:

    class Solution { public: int sum(int i, int j){ int count = 0; while(i > 0) { count = count + i%10; i = i/10; } while(j > 0) { count = count + j%10; j = j/10; } return count; } int movingCount(int threshold, int rows, int cols) { int num = 0; int dir[5] = {1, 0, -1, 0, 1}; int *matrix = new int[rows*cols]; for(int i = 0; i < rows*cols; i++) matrix[i] = 0; queue<pair<int, int> > q; if(rows > 0 && cols > 0 && threshold >= 0) {q.push({0,0}); matrix[0] = 1;} while(!q.empty()) { pair<int, int> p = q.front(); for(int i = 0; i < 4; i++) { if(sum(p.first+dir[i],p.second+dir[i+1]) <= threshold && \ matrix[(p.first+dir[i])*cols+p.second+dir[i+1]] == 0 && \ p.first+dir[i] >= 0 && p.first+dir[i] < rows && \ p.second+dir[i+1] >= 0 && p.second+dir[i+1] < cols) { q.push({p.first+dir[i],p.second+dir[i+1]}); matrix[(p.first+dir[i])*cols+p.second+dir[i+1]] = 1; } } q.pop(); num++; } return num; } };

    开二位数组:

    int mark[rows][cols]; memset(mark, -1, sizeof(mark));
    Processed: 0.030, SQL: 9