题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
思路
当前能够到达的格子是由前一个格子走过来的,采用区域生长算法。将数据压入队列,如果列队里的坐标满足要求,以(0,0)作为生长点,因为如果(0,0,)都不满足的话,其它就没有满足的了。因为是从小往大的次序放入队列,则将其下面和右面的点的坐标放入队列即可。
// maxInWindows.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct point
{
int x;
int y;
};
point pt;
point growpoint;
class Solution {
public:
int movingCount(int threshold, int rows, int cols)
{
queue<point> temp;
temp.push(pt);
vector<vector<int>> flag(rows,vector<int>(cols));
vector<vector<int>> show;
flag[0][0] = 1;
int cnt = 0;
while (!temp.empty())
{
int p = temp.front().x;
int q = temp.front().y;
f.push_back(p);
f.push_back(q);
show.push_back(f);
f.clear();
int sum = 0;
while (p / 10)
{
sum += p % 10;
p = p / 10;
}
sum += p;
while (q / 10)
{
sum += q % 10;
q = q / 10;
}
sum += q;
if (sum <= threshold)
{
cnt++;
growpoint.x = temp.front().x + 1;
growpoint.y = temp.front().y;
if (growpoint.x >= 0 && growpoint.x<rows && growpoint.y >= 0 && growpoint.y < cols && flag[growpoint.x][growpoint.y]==0)
{
temp.push(growpoint);
flag[growpoint.x][growpoint.y] = 1;
}
growpoint.x = temp.front().x;
growpoint.y = temp.front().y + 1;
if (growpoint.x >= 0 && growpoint.x<rows && growpoint.y>=0 && growpoint.y < cols && flag[growpoint.x][growpoint.y] == 0)
{
temp.push(growpoint);
flag[growpoint.x][growpoint.y] = 1;
}
}
temp.pop();
}
return cnt;
}
};
int main()
{
int threshold, rows, cols;
cin >> threshold >> rows >> cols;
pt.x = 0;
pt.y = 0;
Solution s;
cout << s.movingCount(threshold,rows,cols);
return 0;
}