[编程题] 二进制中有多少个1
时间限制:1秒
空间限制:32768K
把一个32-bit整型转成二进制,其中包含多少个1,比如5的二进制表达是101,其中包含2个1
输入描述:
输入为整型(十进制),只需兼容32-bit即可,如5、32
输出描述:
输出为字符串,如“2”、“1”
输入例子1:
5
输出例子1:
2
例子说明1:
5的二进制是101,其中包含2个1
这是一道位运算的题目,注意之前的符号位
#include <iostream>
using namespace std;
int main()
{
int n, res = 0;
cin >> n;
if (n < 0) {
n = -n;
res++;
}
while (n > 0) {
if (n & 1)
res++;
n = n >> 1;
}
cout << res << endl;
}
[编程题] 机器人移动范围
时间限制:1秒
空间限制:32768K
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
输入描述:
一行三个正整数由空格分开,分别代表行数m,列数n,和坐标数位之和的阈值k,0 < m <= 100, 0 < n <= 100, 0 < k <= 20。
输出描述:
一个正整数,代表该机器人能够到达的格子数量。
输入例子1:
3 3 6
输出例子1:
9
这是一道简单的DFS题目
#include <iostream>
using namespace std;
const int N = 150;
const int dx[] = { 0,1, -1, 0 };
const int dy[] = { 1,0, 0, -1 };
bool visited[N][N];
int n, m, k;
int getNum(int n)
{
int res = 0;
while (n > 0) {
res += n % 10;
n = n / 10;
}
return res;
}
void dfs(int x, int y)
{
//cout << x << " " << y << endl;
visited[x][y] = true;
for (int i = 0; i < 4; i++) {
int x_ = x + dx[i];
int y_ = y + dy[i];
if (x_ >= 0 && x_ < n && y_ >= 0 && y_ < m
&& visited[x_][y_] == false
&& getNum(x_) + getNum(y_) <= k) {
dfs(x_, y_);
}
}
}
int main()
{
cin >> n >> m >> k;
dfs(0, 0);
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (visited[i][j])
res++;
}
}
cout << res << endl;
}